У меня есть система, где клиент (назовем его ClientA) может публиковать запросы на определенную тему MQTT. Брокером, в случае необходимости, является Amazon Web Services. Затем у меня есть другой клиент (назовем его MainSubscriber), который всегда подписан на одну и ту же тему, чтобы он мог получать запросы от ClientA и выполнять некоторую работу, которая, в конце концов, превращается в операцию базы данных. База данных, если это имеет значение, - DynamoDB.
Поскольку основной подписчик может быть не всегда доступен / онлайн, существует желание иметь отказоустойчивого подписчика, который будет резервным резервным резервным копированием основного подписчика. Идея состоит в том, что если основной подписчик не обрабатывает запрос своевременно, то отказоустойчивый подписчик включается и выполняет эквивалентную работу / работу с базой данных. Проблема заключается в том, что «работа» и получающаяся «операция с базой данных» не должны дублироваться как основным, так и отказоустойчивым подписчиками.
Вот чертеж архитектуры логической системы для этой системы.
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
Очевидно, что с такой системой есть некоторые проблемы:
- Как основной подписчик указывает отказоустойчивому подписчику, что он работает над запросом?
- Как отказоустойчивый подписчик обнаруживает, что основной подписчик не принял запрос и должен начать работу над ним?
- Как тогда отказоустойчивый подписчик удерживает основного подписчика в случае, если он внезапно возвращается в оперативный режим и принимает запрос?
- Как бороться с проблемами синхронности между основным и отказоустойчивым абонентами?
Я бы не стал изобретать велосипед, если для такой схемы уже существует существующее решение. Итак, мой первый вопрос: есть ли что-то уже там?
Если нет, то я думал об использовании DynamoDB со строго согласованным чтением, чтобы выступать в качестве посредника между основным и отказоустойчивым подписчиком. Итак, мой второй вопрос: существуют ли какие-либо хорошо разработанные схемы для этого?