คำถามติดแท็ก producer-consumer

3
วิธีการนำคิวข้อความไปใช้กับ Redis
ทำไม Redis ถึงเข้าคิว? ฉันอยู่ภายใต้ความประทับใจที่ Redis สามารถสร้างผู้สมัครที่ดีสำหรับการนำระบบคิวเข้ามาใช้ จนถึงตอนนี้เราได้ใช้ฐานข้อมูล MySQL กับโพลหรือ RabbitMQ ด้วย RabbitMQ เรามีปัญหามากมาย - ห้องสมุดลูกค้านั้นแย่มากและบั๊กกี้และเราไม่ต้องการลงทุนชั่วโมงนักพัฒนามากเกินไปในการแก้ไขปัญหาเหล่านี้ปัญหาบางอย่างเกี่ยวกับคอนโซลการจัดการเซิร์ฟเวอร์ ฯลฯ และในเวลานั้น อย่างน้อยเราก็ไม่ได้จับเป็นมิลลิวินาทีหรือผลักดันประสิทธิภาพอย่างจริงจังดังนั้นตราบใดที่ระบบมีสถาปัตยกรรมที่รองรับคิวอย่างชาญฉลาดเราอาจมีรูปร่างที่ดี ตกลงนั่นคือพื้นหลัง โดยพื้นฐานแล้วฉันมีโมเดลคิวที่เรียบง่ายคลาสสิกผู้ผลิตหลายรายผลิตงานและบริโภคผู้บริโภคจำนวนมากและทั้งผู้ผลิตและผู้บริโภคต้องสามารถปรับขนาดได้อย่างชาญฉลาด ปรากฎว่าไร้เดียงสาPUBSUBไม่ทำงานเนื่องจากฉันไม่ต้องการให้สมาชิกทั้งหมดใช้งานฉันแค่ต้องการสมาชิกหนึ่งคนเพื่อรับงาน ที่ผ่านครั้งแรกมันดูเหมือนฉันชอบBRPOPLPUSHคือการออกแบบที่ชาญฉลาด เราสามารถใช้ BRPOPLPUSH ได้หรือไม่? การออกแบบพื้นฐานด้วยBRPOPLPUSHคือคุณมีคิวงานหนึ่งคิวและคิวความคืบหน้า เมื่อผู้บริโภคได้รับการทำงานมันอะตอมผลักดันรายการลงในคิวความคืบหน้าและเมื่อเสร็จสิ้นการทำงานมันLREMเป็นมัน สิ่งนี้จะช่วยป้องกันไม่ให้เกิดการปิดกั้นการทำงานหากลูกค้าตายและทำการตรวจสอบได้อย่างง่ายดาย - ตัวอย่างเช่นเราสามารถบอกได้ว่ามีปัญหาที่ทำให้ผู้บริโภคต้องใช้เวลานานในการปฏิบัติงานนอกเหนือจากการบอกว่ามีงานจำนวนมากหรือไม่ มันทำให้มั่นใจ ส่งมอบงานให้กับผู้บริโภคเพียงรายเดียว ทำงานช้าลงในคิวที่กำลังดำเนินการอยู่ดังนั้นจึงไม่สามารถปิดกั้นผู้บริโภคได้ ข้อเสียเปรียบ มันค่อนข้างแปลกสำหรับฉันที่การออกแบบที่ดีที่สุดที่ฉันพบไม่ได้ใช้จริงPUBSUBเนื่องจากนี่เป็นสิ่งที่บล็อกโพสต์ส่วนใหญ่เกี่ยวกับการรอคิว Redis ดังนั้นฉันรู้สึกว่าฉันขาดอะไรบางอย่างที่ชัดเจน วิธีเดียวที่ฉันเห็นการใช้งานPUBSUBโดยไม่ต้องเสียงานสองครั้งคือเพียงแค่ส่งการแจ้งเตือนว่างานมาถึงแล้วซึ่งผู้บริโภคสามารถไม่ปิดกั้นRPOPLPUSHได้ เป็นไปไม่ได้ที่จะขอมากกว่าหนึ่งรายการงานในแต่ละครั้งซึ่งดูเหมือนว่าจะเป็นปัญหาด้านประสิทธิภาพ ไม่ใช่เรื่องใหญ่สำหรับสถานการณ์ของเรา แต่เห็นได้ชัดว่าการดำเนินการนี้ไม่ได้ถูกออกแบบมาสำหรับปริมาณงานสูงหรือสถานการณ์นี้ ในระยะสั้น: ฉันไม่มีอะไรที่โง่หรือเปล่า? เพิ่มแท็ก node.js ด้วยเพราะนั่นคือภาษาที่ฉันใช้เป็นหลัก โหนดอาจเสนอการทำให้เรียบง่ายบางอย่างในการดำเนินการเนื่องจากลักษณะแบบเธรดเดียวและไม่มีการปิดกั้น แต่ยิ่งไปกว่านั้นฉันใช้ไลบรารี่ node-redis และวิธีแก้ปัญหาควรหรืออาจอ่อนไหวต่อจุดแข็งและจุดอ่อนของมัน

1
ความแตกต่างระหว่าง Consumer / Producer และ Observer / Observable
ฉันกำลังทำงานเกี่ยวกับการออกแบบแอปพลิเคชันที่ประกอบด้วยสามส่วน: เธรดเดียวที่เฝ้าดูเหตุการณ์บางอย่างที่เกิดขึ้น (การสร้างไฟล์คำขอภายนอก ฯลฯ ) เธรดผู้ปฏิบัติงาน N ที่ตอบสนองต่อเหตุการณ์เหล่านี้โดยการประมวลผล (ผู้ปฏิบัติงานแต่ละกระบวนการและใช้เหตุการณ์เดียวและการประมวลผลอาจใช้เวลาแปรผัน) คอนโทรลเลอร์ที่จัดการเธรดเหล่านั้นและจัดการข้อผิดพลาด (การรีสตาร์ทเธรดการบันทึกผลลัพธ์) แม้ว่านี่จะค่อนข้างพื้นฐานและไม่ยากที่จะนำมาใช้ แต่ฉันก็สงสัยว่ามันจะเป็นวิธีที่ "ถูกต้อง" (ในกรณีที่เป็นรูปธรรมนี้ใน Java แต่คำตอบที่เป็นนามธรรมก็สูงขึ้นเช่นกัน) กลยุทธ์ทั้งสองมาถึงใจ: ผู้สังเกตการณ์ / สังเกตได้:ผู้สังเกตการณ์จะเฝ้าสังเกตด้ายดู ในกรณีที่มีเหตุการณ์เกิดขึ้นคอนโทรลเลอร์จะได้รับแจ้งและสามารถมอบหมายงานใหม่ให้กับเธรดอิสระจากกลุ่มเธรดแคชที่ใช้ซ้ำได้ (หรือรอและแคชงานในคิว FIFO หากเธรดทั้งหมดไม่ว่างในขณะนี้) เธรดผู้ปฏิบัติงานใช้ Callable และส่งคืนผลลัพธ์ที่สำเร็จพร้อมกับผลลัพธ์ (หรือค่าบูลีน) หรือส่งคืนพร้อมข้อผิดพลาดในกรณีนี้ผู้ควบคุมอาจตัดสินใจว่าจะทำอย่างไร (ขึ้นอยู่กับลักษณะของข้อผิดพลาดที่เกิดขึ้น) ผู้ผลิต / ผู้บริโภค : เธรดการเฝ้าดูที่ใช้ร่วมกัน BlockingQueue กับตัวควบคุม (เหตุการณ์คิว) และตัวควบคุมที่ใช้ร่วมกันสองกับคนงานทั้งหมด (งานคิวและผลคิว) ในกรณีที่เกิดเหตุการณ์ด้ายเฝ้าดูทำให้วัตถุงานในคิวเหตุการณ์ คอนโทรลเลอร์ใช้งานใหม่จาก event-queue ตรวจสอบและวางไว้ใน task-queue ผู้ปฏิบัติงานแต่ละคนรองานใหม่และรับ / ใช้งานจากคิวงาน (มาก่อนได้รับก่อนจัดการโดยคิวเอง) …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.