У мене є система, де клієнт (назвемо його ClientA) може публікувати запити на певну тему MQTT. Брокер, якщо це має значення, є Amazon Web Services. Тоді у мене є інший клієнт (назвемо це MainSubscriber), який завжди підписаний на одну і ту ж тему, щоб він міг забрати запити від ClientA і виконати певну роботу, яка, врешті-решт, перетворюється на роботу з базою даних. База даних, якщо це має значення, є DynamoDB.
Оскільки MainSubscriber може бути не завжди доступним / в Інтернеті, існує бажання, щоб підписник з відмовою не був резервним копією основного абонента. Ідея полягає в тому, що якщо основний абонент не звертається із запитом своєчасно, тоді абонент, який перебуває в режимі відмови, би кинувся і виконав еквівалентну роботу / роботу з базою даних. Проблема полягає в тому, що "робота" та отримана в результаті "операція з базою даних" не повинні дублюватися як основними, так і відмовними абонентами.
Ось логічний малюнок архітектури системи для цієї системи.
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
Зрозуміло, що з такою системою є деякі проблеми:
- Як основний абонент вказує передплатнику, який працює на відмову, що працює над запитом?
- Як підписка на відмову виявляє, що основний абонент не взяв запит і йому потрібно розпочати роботу над ним?
- Як тоді абонент, який перебуває в режимі відмови, відтримує основного абонента, якщо він раптом повернеться в Інтернет і забирає запит?
- Як вирішувати проблеми синхронізації між основними або аварійними абонентами?
Я б не хотів би винаходити колесо, якщо вже існує рішення для такої схеми. Отже, моє перше питання - чи є вже щось там?
Якщо ні, то я думав використати DynamoDB із сильно послідовними читаннями, щоб діяти як посередник між основним або відмовленим абонентом. Отже, моє друге питання - чи існують чітко встановлені схеми для цього?