ฉันมีระบบที่ลูกค้า (เรียกว่า ClientA) สามารถเผยแพร่คำขอไปยังหัวข้อ MQTT เฉพาะ โบรกเกอร์ในกรณีที่สำคัญคือ Amazon Web Services จากนั้นฉันมีไคลเอนต์อื่น (เรียกว่า MainSubscriber) ซึ่งมักจะสมัครเป็นสมาชิกหัวข้อเดียวกันเสมอเพื่อให้สามารถรับคำขอจาก ClientA และทำงานบางอย่างที่ในที่สุดจะกลายเป็นการดำเนินการฐานข้อมูล ฐานข้อมูลในกรณีที่เป็นเรื่องสำคัญคือ DynamoDB
เนื่องจาก MainSubscriber อาจไม่สามารถเข้าถึง / ออนไลน์ได้ตลอดเวลาจึงมีความปรารถนาที่จะให้ผู้สมัครสมาชิก failover เป็นผู้สำรองข้อมูล failover ของผู้สมัครสมาชิกหลัก แนวคิดก็คือหากผู้สมัครสมาชิกหลักไม่จัดการคำขอในเวลาที่กำหนดผู้สมัครสมาชิกที่ล้มเหลวจะเริ่มต้นและดำเนินการทำงาน / ฐานข้อมูลที่เทียบเท่า ความท้าทายคือว่า "งาน" และ "การดำเนินการฐานข้อมูล" ที่เป็นผลลัพธ์จะต้องไม่ซ้ำซ้อนโดยสมาชิกหลักและสมาชิกล้มเหลว
นี่คือการวาดภาพสถาปัตยกรรมระบบตรรกะสำหรับระบบนี้
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
เห็นได้ชัดว่ามีความท้าทายบางอย่างกับระบบดังกล่าว:
- ผู้สมัครสมาชิกหลักระบุอย่างไรกับผู้สมัครสมาชิกล้มเหลวว่าทำงานในคำขอหรือไม่
- ผู้สมัครสมาชิกล้มเหลวตรวจพบได้อย่างไรว่าผู้สมัครสมาชิกหลักไม่ได้รับคำขอและจำเป็นต้องเริ่มทำงานกับมัน
- ผู้สมัครสมาชิก failover จะปิดการเป็นสมาชิกหลักได้อย่างไรในกรณีที่ทุกอย่างกลับมาออนไลน์อีกครั้งและรับคำขอ?
- วิธีจัดการกับปัญหาซิงโครไนซ์ระหว่างสมาชิกหลักและสมาชิกล้มเหลว
ฉันไม่ต้องการที่จะบูรณาการล้อถ้ามีวิธีการแก้ปัญหาที่มีอยู่แล้วสำหรับโครงการดังกล่าว ดังนั้นคำถามแรกของฉันคือมีอะไรออกไปบ้างแล้ว?
ถ้าไม่เช่นนั้นฉันก็คิดว่าจะใช้ DynamoDB กับ Strongly Consistent อ่านเพื่อทำหน้าที่เป็นสื่อกลางระหว่างสมาชิกหลักและ Failover ดังนั้นคำถามที่สองของฉันคือว่ามีแผนการที่ดีขึ้นสำหรับการทำเช่นนี้?