Ho un sistema in cui un client (chiamiamolo ClientA) può pubblicare richieste su un particolare argomento MQTT. Il broker, nel caso sia importante, è Amazon Web Services. Poi ho un altro client (chiamiamolo MainSubscriber) che è sempre iscritto allo stesso argomento in modo che possa raccogliere richieste da ClientA e fare un lavoro che, alla fine, si trasforma in un'operazione di database. Il database, nel caso sia importante, è DynamoDB.
Poiché MainSubscriber potrebbe non essere sempre accessibile / online, si desidera che un abbonato di failover sia il backup di failover dell'abbonato principale. L'idea è che se l'abbonato principale non gestisce la richiesta in modo tempestivo, l'abbonato al failover si avvia e fa l'operazione di lavoro / database equivalente. La sfida è che il "lavoro" e la risultante "operazione di database" non devono essere duplicati da abbonati principali e di failover.
Ecco un disegno logico di architettura di sistema per questo sistema.
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
Chiaramente, ci sono alcune sfide con un tale sistema:
- In che modo il sottoscrittore principale indica al sottoscrittore di failover che sta lavorando alla richiesta?
- In che modo l'abbonato al failover rileva che l'abbonato principale non ha raccolto la richiesta e deve iniziare a lavorarci?
- In che modo l'abbonato al failover trattiene quindi l'abbonato principale nel caso in cui improvvisamente ritorni online e raccolga la richiesta?
- Come gestire i problemi di sincronicità tra abbonati principali e di failover?
Preferirei non dover reinventare la ruota se esiste già una soluzione esistente per un tale schema. Quindi, la mia prima domanda è se c'è già qualcosa là fuori?
In caso contrario, stavo pensando di utilizzare DynamoDB con letture fortemente coerenti per agire come mediatore tra l'abbonato Main e Failover. Quindi, la mia seconda domanda è se ci sono schemi ben stabiliti per farlo?