วิธีใช้กลุ่มผู้บริโภคใน Redis Streams

Roshan Kumar เป็นผู้จัดการผลิตภัณฑ์อาวุโสของ Redis Labs

Redis Streams เป็นโครงสร้างข้อมูลใหม่ที่นำมาใช้ใน Redis 5.0 ซึ่งช่วยให้คุณสร้างและจัดการสตรีมข้อมูลได้ ในบทความก่อนหน้านี้ฉันได้แสดงวิธีเพิ่มข้อมูลลงในสตรีมและวิธีอ่านข้อมูลในหลาย ๆ วิธี ในบทความนี้ฉันจะอธิบายวิธีใช้กลุ่มผู้บริโภคใน Redis Streams กลุ่มผู้บริโภคเป็นวิธีการแยกสตรีมข้อความระหว่างลูกค้าหลายรายเพื่อเร่งความเร็วในการประมวลผลหรือแบ่งเบาภาระสำหรับผู้บริโภคที่ทำงานช้าลง

ในโลกที่สมบูรณ์แบบทั้งผู้ผลิตข้อมูลและผู้บริโภคทำงานในจังหวะเดียวกันและไม่มีข้อมูลสูญหายหรือข้อมูลค้าง น่าเสียดายที่ไม่ใช่อย่างนั้นในโลกแห่งความเป็นจริง ในกรณีการใช้งานการประมวลผลสตรีมข้อมูลแบบเรียลไทม์เกือบทั้งหมดผู้ผลิตและผู้บริโภคทำงานด้วยความเร็วที่แตกต่างกัน นอกจากนี้ยังมีผู้บริโภคมากกว่าหนึ่งประเภทซึ่งแต่ละประเภทมีความต้องการและขั้นตอนการประมวลผลของตัวเอง Redis Streams ตอบสนองความต้องการนี้ด้วยชุดคุณลักษณะที่ดึงดูดผู้บริโภคอย่างมาก คุณลักษณะที่สำคัญที่สุดประการหนึ่งคือกลุ่มผู้บริโภค

เมื่อใดควรใช้กลุ่มผู้บริโภค Redis Streams

จุดประสงค์ของกลุ่มผู้บริโภคคือการปรับขนาดกระบวนการบริโภคข้อมูลของคุณ ลองพิจารณาตัวอย่างหนึ่ง - แอปพลิเคชันการประมวลผลภาพ การแก้ปัญหาต้องใช้องค์ประกอบหลักสามประการ:

  1. โปรดิวเซอร์ (อาจมีกล้องตั้งแต่หนึ่งตัวขึ้นไป) ที่จับภาพและจัดเก็บภาพ
  2. Redis Stream ที่บันทึกภาพ (ในที่เก็บข้อมูลสตรีม) ตามลำดับที่มาถึง และ
  3. ตัวประมวลผลภาพที่ประมวลผลแต่ละภาพ 
Redis Labs

สมมติว่าผู้ผลิตของคุณบันทึกภาพได้ 500 ภาพต่อวินาทีและตัวประมวลผลภาพประมวลผลเพียง 100 ภาพต่อวินาทีอย่างเต็มประสิทธิภาพ ความแตกต่างของอัตรานี้จะสร้างงานในมือและตัวประมวลผลภาพของคุณจะไม่สามารถติดตามได้ วิธีง่ายๆในการแก้ไขปัญหานี้คือการเรียกใช้ตัวประมวลผลภาพห้าตัว (ดังแสดงในรูปที่ 2) โดยแต่ละตัวประมวลผลชุดภาพที่ไม่ซ้ำกัน คุณสามารถทำสิ่งนี้ได้ผ่านกลุ่มผู้บริโภคซึ่งช่วยให้คุณแบ่งปริมาณงานของคุณและกำหนดเส้นทางไปยังผู้บริโภคที่แตกต่างกัน

Redis Labs

กลุ่มผู้บริโภคทำมากกว่าการแบ่งข้อมูล - ทำให้มั่นใจได้ถึงความปลอดภัยของข้อมูลและเปิดใช้งานการกู้คืนจากภัยพิบัติ

กลุ่มผู้บริโภค Redis Streams ทำงานอย่างไร

กลุ่มผู้บริโภคคือโครงสร้างข้อมูลภายใน Redis Stream ดังแสดงในรูปที่ 3 คุณสามารถนึกถึงกลุ่มผู้บริโภคเป็นกลุ่มรายชื่อ สิ่งที่น่าคิดอีกประการหนึ่งคือรายการสิ่งของที่ผู้บริโภคไม่ได้บริโภค - สำหรับการสนทนาของเราขอเรียกสิ่งนี้ว่า "รายการที่ไม่มีการบริโภค" เมื่อข้อมูลมาถึงในสตรีมข้อมูลจะถูกส่งไปยังรายการที่ไม่มีการบริโภคทันที

Redis Labs

กลุ่มผู้บริโภคจะเก็บรักษารายการแยกต่างหากสำหรับผู้บริโภคแต่ละรายโดยทั่วไปจะมีใบสมัคร ในรูปที่ 3 โซลูชันของเรามีNแอปพลิเคชันที่เหมือนกัน (App 1, App 2, …. App n) ที่อ่านข้อมูลผ่าน Consumer 1, Consumer 2, … Consumer n ตามลำดับ

เมื่อแอปอ่านข้อมูลโดยใช้คำสั่ง XREADGROUP รายการข้อมูลที่ระบุจะถูกลบออกจากรายการที่ไม่มีการบริโภคและผลักเข้าไปในรายการรายการที่รอดำเนินการซึ่งเป็นของผู้บริโภคที่เกี่ยวข้อง ดังนั้นจึงไม่มีผู้บริโภคสองรายที่จะใช้ข้อมูลเดียวกัน

สุดท้ายเมื่อแอปแจ้งสตรีมด้วยคำสั่ง XACK แอปจะลบรายการออกจากรายการรอดำเนินการของผู้บริโภค

ตอนนี้ฉันได้อธิบายพื้นฐานของกลุ่มผู้บริโภคแล้วเรามาดูวิธีการทำงานของวงจรชีวิตข้อมูลนี้กัน

การสร้างกลุ่มผู้บริโภค Redis Streams

คุณสามารถสร้างกลุ่มผู้บริโภคใหม่โดยใช้คำสั่ง XGROUP CREATE ดังที่แสดงด้านล่าง

XGROUP สร้าง mystream mygroup $ MKSTREAM

เช่นเดียวกับ XREAD เครื่องหมาย $ ที่ท้ายคำสั่งจะบอกให้สตรีมส่งเฉพาะข้อมูลใหม่จากจุดนั้นในเวลาข้างหน้า ตัวเลือกอื่นคือ 0 หรือ ID อื่นจากรายการสตรีม เมื่อใช้ 0 สตรีมจะส่งข้อมูลทั้งหมดตั้งแต่เริ่มต้นสตรีม

MKSTREAM สร้างสตรีมใหม่ mystream ในกรณีนี้หากยังไม่มีอยู่

การอ่านและจัดการข้อมูล Redis Stream

สมมติว่าคุณมี Redis Stream (mystream) และคุณได้สร้างกลุ่มผู้บริโภค (mygroup) แล้วดังที่แสดงด้านบน ตอนนี้คุณสามารถเพิ่มรายการที่มีชื่อ a, b, c, d, e ดังตัวอย่างต่อไปนี้

XADD mystream * ชื่อก

การรันคำสั่งนี้สำหรับชื่อ a ถึง e จะเติมข้อมูล Redis Stream, mystream และรายการที่ไม่มีการบริโภคของ mystream กลุ่มผู้บริโภค นี่แสดงในรูปที่ 4

Redis Labs

คุณจะเห็นได้ว่าผู้บริโภค Alice และ Bob ยังไม่ได้เริ่มงาน แอป A ใช้ข้อมูลผ่านผู้บริโภค Alice ในขณะที่ App B ใช้ข้อมูลผ่าน Bob

การใช้ข้อมูล Redis Streams

คำสั่งในการอ่านข้อมูลจากกลุ่มคือ XREADGROUP ในตัวอย่างของเราเมื่อ App A เริ่มประมวลผลข้อมูลแอปจะเรียกผู้บริโภค (อลิซ) เพื่อดึงข้อมูลดังใน:

กลุ่ม XREADGROUP mygroup COUNT 2 Alice STREAMS mystream>

ในทำนองเดียวกัน App B อ่านข้อมูลผ่าน Bob ดังนี้:

กลุ่ม XREADGROUP mygroup COUNT 2 Bob STREAMS mystream>

อักขระพิเศษ> ในตอนท้ายจะบอกให้ Redis Streams ดึงเฉพาะรายการข้อมูลที่ไม่ได้ส่งถึงผู้บริโภครายอื่น โปรดทราบว่าจะไม่มีผู้บริโภคสองรายใช้ข้อมูลเดียวกันซึ่งจะส่งผลให้มีการย้ายข้อมูลจากรายการที่ไม่มีการบริโภคไปยัง Alice และ Bob ดังแสดงในรูปที่ 5

Redis Labs

การลบข้อความที่ประมวลผลออกจากรายการที่รอดำเนินการ

ข้อมูลในรายการที่รอดำเนินการของผู้บริโภคของคุณจะยังคงอยู่ที่นั่นจนกว่า App A และ App B จะรับทราบกับ Redis Streams ว่าพวกเขาใช้ข้อมูลสำเร็จแล้ว ทำได้โดยใช้คำสั่ง XACK ตัวอย่างเช่น App A จะรับทราบดังต่อไปนี้หลังจากบริโภค d และ e ซึ่งมีรหัส 1526569411111-0 และ 1526569411112-0

XACK mystream mygroup 1526569411111-0 1526569411112-0

การรวมกันของ XREADGROUP และ XACK นั้นคล้ายคลึงกับการเริ่มต้นธุรกรรมและการกระทำซึ่งทำให้มั่นใจได้ถึงความปลอดภัยของข้อมูล 

หลังจากเรียกใช้ XACK สมมติว่า App A เรียกใช้ XREADGROUP ดังที่แสดงด้านล่าง ตอนนี้โครงสร้างข้อมูลดูเหมือนรูปที่ 6

กลุ่ม XREADGROUP mygroup COUNT 2 Alice STREAMS mystream>
Redis Labs

การกู้คืนจากความล้มเหลว

หากแอป B สิ้นสุดลงเนื่องจากความล้มเหลวขณะประมวลผล b และ c โครงสร้างข้อมูลจะมีลักษณะดังรูปที่ 7

Redis Labs

ตอนนี้คุณเหลือสองทางเลือก:

1. รีสตาร์ทแอพ B และโหลดข้อมูลจากผู้บริโภค (Bob) อีกครั้ง

ในกรณีนี้ App B ต้องอ่านข้อมูลจากผู้บริโภคของคุณ (Bob) โดยใช้คำสั่ง XREADGROUP แต่มีข้อแตกต่างอย่างหนึ่ง แทนที่จะเป็น> ในตอนท้าย App B จะส่งผ่าน 0 (หรือ ID ต่ำกว่ารายการข้อมูลก่อนหน้าที่ประมวลผล) โปรดจำไว้ว่า> ส่งข้อมูลใหม่จากรายการที่ไม่มีการบริโภคไปยังผู้บริโภค

กลุ่ม XREADGROUP mygroup COUNT 2 Bob STREAMS mystream 0

คำสั่งดังกล่าวจะดึงรายการข้อมูลที่จัดเก็บไว้แล้วในรายการสำหรับผู้บริโภค Bob จะไม่ดึงข้อมูลใหม่จากรายการที่ไม่ได้บริโภค App B สามารถทำซ้ำข้อมูลทั้งหมดใน Bob ผู้บริโภคก่อนที่จะดึงข้อมูลใหม่

2. บังคับให้ Alice อ้างสิทธิ์ข้อมูลทั้งหมดจาก Bob และประมวลผลผ่าน App A

สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณไม่สามารถกู้คืน App B ได้เนื่องจากโหนดดิสก์หรือเครือข่ายล้มเหลว ในกรณีเช่นนี้ผู้บริโภครายอื่น ๆ (เช่น Alice) สามารถอ้างสิทธิ์ข้อมูลของ Bob และประมวลผลข้อมูลนั้นต่อไปได้ซึ่งจะป้องกันไม่ให้บริการหยุดทำงาน ในการอ้างสิทธิ์ข้อมูลของ Bob คุณต้องเรียกใช้คำสั่งสองชุด:

XPENDING mystream mygroup - + 10 Bob

การดำเนินการนี้จะดึงรายการข้อมูลที่รอดำเนินการทั้งหมดสำหรับ Bob ตัวเลือก - และ + ดึงข้อมูลช่วงทั้งหมด ถ้า b และ c มี ID 1526569411113-0 และ 1526569411114-0 ตามลำดับคำสั่งที่จะย้ายข้อมูลของ Bob ไปยัง Alice จะเป็นดังนี้:

XCLAIM mystream mygroup อลิซ 0 1526569411113-0 1526569411114-0

กลุ่มผู้บริโภครักษานาฬิกาที่ทำงานอยู่สำหรับข้อมูลในรายการที่ใช้ ตัวอย่างเช่นเมื่อ App B อ่าน b นาฬิกาจะเริ่มทำงานจนกว่า Bob จะได้รับ ACK ด้วยตัวเลือกเวลาในคำสั่ง XCLAIM คุณสามารถบอกให้กลุ่มผู้บริโภคย้ายเฉพาะข้อมูลที่ไม่มีการใช้งานนานกว่าเวลาที่กำหนด คุณยังสามารถเพิกเฉยได้โดยการส่ง 0 ดังที่แสดงในตัวอย่างด้านบน ผลลัพธ์ของคำสั่งเหล่านี้แสดงไว้ในรูปที่ 8 นอกจากนี้ XCLAIM ยังมีประโยชน์เมื่อโปรเซสเซอร์สำหรับผู้บริโภคของคุณทำงานช้าส่งผลให้มีข้อมูลค้างที่ยังไม่ได้ประมวลผล

Redis Labs

ในบทความก่อนหน้านี้เราได้กล่าวถึงพื้นฐานเกี่ยวกับวิธีใช้ Redis Streams เราเจาะลึกลงไปอีกเล็กน้อยในบทความนี้และอธิบายว่าเมื่อใดควรใช้กลุ่มผู้บริโภคและวิธีการทำงาน กลุ่มผู้บริโภคใน Redis Streams ช่วยลดภาระของคุณในการจัดการพาร์ติชันข้อมูลวงจรชีวิตและความปลอดภัยของข้อมูล นอกจากนี้ความสามารถในการขยายขนาดของกลุ่มผู้บริโภคยังให้ประโยชน์กับแอปพลิเคชันแบบเรียลไทม์มากมาย

ในบทความที่สามที่กำลังจะมาถึงเกี่ยวกับ Redis Streams ฉันจะสาธิตวิธีการพัฒนาแอปพลิเคชันการจัดประเภทแบบเรียลไทม์โดยใช้ Redis Streams และ Lettuce ซึ่งเป็นไลบรารีโอเพนซอร์สบน Java สำหรับ Redis ในขณะเดียวกันคุณสามารถเรียนรู้เพิ่มเติมได้โดยทำงานผ่านบทช่วยสอน Redis Streams บนเว็บไซต์โครงการ Redis 

ชานมาร์เป็นผู้จัดการผลิตภัณฑ์อาวุโสที่  Redis Labs เขามีประสบการณ์มากมายในการพัฒนาซอฟต์แวร์และการตลาดเทคโนโลยี Roshan เคยทำงานที่ Hewlett-Packard และ บริษัท สตาร์ทอัพใน Silicon Valley ที่ประสบความสำเร็จมากมายเช่น ZillionTV, Salorix, Alopa และ ActiveVideo ในฐานะโปรแกรมเมอร์ที่กระตือรือร้นเขาได้ออกแบบและพัฒนา mindzeal.com ซึ่งเป็นแพลตฟอร์มออนไลน์ที่โฮสต์หลักสูตรการเขียนโปรแกรมคอมพิวเตอร์สำหรับนักเรียนรุ่นใหม่ Roshan สำเร็จการศึกษาระดับปริญญาตรีสาขาวิทยาการคอมพิวเตอร์และปริญญาโทบริหารธุรกิจจากมหาวิทยาลัยซานตาคลารา

-

New Tech Forum เป็นสถานที่สำหรับสำรวจและพูดคุยเกี่ยวกับเทคโนโลยีสำหรับองค์กรที่เกิดขึ้นใหม่ในเชิงลึกและเชิงกว้าง การเลือกเป็นเรื่องส่วนตัวขึ้นอยู่กับการเลือกใช้เทคโนโลยีที่เราเชื่อว่ามีความสำคัญและเป็นที่สนใจของผู้อ่านมากที่สุด ไม่ยอมรับหลักประกันทางการตลาดสำหรับการตีพิมพ์และขอสงวนสิทธิ์ในการแก้ไขเนื้อหาที่มีส่วนร่วมทั้งหมด ส่งสอบถามข้อมูลทั้งหมดจะ  [email protected]