ฉันจะตั้งค่าสมาชิก MQTT หลักและ failover สำหรับคิวงานด้วย AWS IoT ได้อย่างไร


11

ฉันมีระบบที่ลูกค้า (เรียกว่า ClientA) สามารถเผยแพร่คำขอไปยังหัวข้อ MQTT เฉพาะ โบรกเกอร์ในกรณีที่สำคัญคือ Amazon Web Services จากนั้นฉันมีไคลเอนต์อื่น (เรียกว่า MainSubscriber) ซึ่งมักจะสมัครเป็นสมาชิกหัวข้อเดียวกันเสมอเพื่อให้สามารถรับคำขอจาก ClientA และทำงานบางอย่างที่ในที่สุดจะกลายเป็นการดำเนินการฐานข้อมูล ฐานข้อมูลในกรณีที่เป็นเรื่องสำคัญคือ DynamoDB

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

นี่คือการวาดภาพสถาปัตยกรรมระบบตรรกะสำหรับระบบนี้

                   -----> MainSubscriber ----
                  /                          \
ClientA --> Broker                            ---> Database
                  \                          /
                   ---> FailoverSubscriber --

เห็นได้ชัดว่ามีความท้าทายบางอย่างกับระบบดังกล่าว:

  1. ผู้สมัครสมาชิกหลักระบุอย่างไรกับผู้สมัครสมาชิกล้มเหลวว่าทำงานในคำขอหรือไม่
  2. ผู้สมัครสมาชิกล้มเหลวตรวจพบได้อย่างไรว่าผู้สมัครสมาชิกหลักไม่ได้รับคำขอและจำเป็นต้องเริ่มทำงานกับมัน
  3. ผู้สมัครสมาชิก failover จะปิดการเป็นสมาชิกหลักได้อย่างไรในกรณีที่ทุกอย่างกลับมาออนไลน์อีกครั้งและรับคำขอ?
  4. วิธีจัดการกับปัญหาซิงโครไนซ์ระหว่างสมาชิกหลักและสมาชิกล้มเหลว

ฉันไม่ต้องการที่จะบูรณาการล้อถ้ามีวิธีการแก้ปัญหาที่มีอยู่แล้วสำหรับโครงการดังกล่าว ดังนั้นคำถามแรกของฉันคือมีอะไรออกไปบ้างแล้ว?

ถ้าไม่เช่นนั้นฉันก็คิดว่าจะใช้ DynamoDB กับ Strongly Consistent อ่านเพื่อทำหน้าที่เป็นสื่อกลางระหว่างสมาชิกหลักและ Failover ดังนั้นคำถามที่สองของฉันคือว่ามีแผนการที่ดีขึ้นสำหรับการทำเช่นนี้?


คุณตรวจสอบว่าคิวข้อความเช่นAmazon SQSอาจมีประโยชน์หรือไม่ ดูเหมือนว่าจะมีการผสานรวมกับ AWS IoTและดูเหมาะสมสำหรับปัญหาสไตล์ 'คิวงาน'
Aurora0001

คำตอบ:


8

ตามเอกสาร AWS SQS (ตามที่คุณบอกว่านายหน้าคือ AWS) สิ่งนี้ควรเป็นภาษา:

ทันทีหลังจากได้รับข้อความจะยังคงอยู่ในคิว เพื่อป้องกันไม่ให้ผู้บริโภครายอื่นประมวลผลข้อความอีกครั้ง Amazon SQS ตั้งค่าการหมดเวลาการมองเห็นระยะเวลาที่ Amazon SQS ป้องกันไม่ให้ส่วนประกอบอื่น ๆ ที่ใช้บริโภครับและประมวลผลข้อความ

ปัญหาในการค้นหาการหมดเวลาการมองเห็นที่เหมาะสมตามเวลาการประมวลผลสูงสุดของคุณ

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


7

คุณอาจต้องการที่จะดูที่แนวคิดของคิวที่ตายแล้วตัวอักษรของ AWS SQS จากเอกสาร AWS:

คิวจดหมายที่ตายแล้วคือคิวที่คิวอื่น (ต้นทาง) สามารถกำหนดเป้าหมายสำหรับข้อความที่ไม่สามารถประมวลผลได้ (ใช้แล้ว) ได้สำเร็จ คุณสามารถตั้งสำรองและแยกข้อความเหล่านี้ในคิวตัวอักษรตายเพื่อกำหนดสาเหตุที่การประมวลผลไม่สำเร็จ

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

นอกจากนี้ปัญหาของคุณ 1, 2 และ 3 จะได้รับการดูแล สมาชิกหลักและรองไม่จำเป็นต้องคุยกันในกรณีนี้

นอกจากนี้การสร้างตามคำตอบของ Tensibai ให้แน่ใจว่ารหัสสมาชิกของคุณถูกเขียนเพื่อที่จะได้รับหนึ่งข้อความในเวลาถ้าสมาชิกหลายคนกำลังฟังคิวเดียวกันเนื่องจากvisibility timeout


ข้อเสียก็คือมันจะทำให้เกิดความล่าช้าในการประมวลผลข้อความจะเข้าสู่คิวจดหมายตายหลังจากผ่านไปครู่หนึ่ง

ดังนั้นในกรณีที่คุณไม่ต้องการสิ่งนั้นคุณสามารถไปข้างหน้ากับคำตอบของ Tensibai และถ้าคุณสามารถทนมันได้แทนที่จะมีตารางไดนาโมพิเศษสำหรับการตรวจสอบสถานะคุณก็สามารถใช้มันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.