我有一个系统,其中客户端(我们称之为 ClientA)可以向特定的 MQTT 主题发布请求。如果重要的话,经纪人是亚马逊网络服务。然后我有另一个客户端(我们称之为 MainSubscriber),它总是订阅同一个主题,这样它就可以从 ClientA 获取请求并做一些工作,最后变成数据库操作。如果重要的话,数据库是 DynamoDB。
由于主订阅者可能并不总是可访问/在线,因此希望有一个故障转移订阅者作为主订阅者的故障转移备份。这个想法是,如果主订阅者没有及时处理请求,那么故障转移订阅者将启动并执行等效的工作/数据库操作。挑战在于“工作”和由此产生的“数据库操作”不能被主订阅者和故障转移订阅者复制。
这是该系统的逻辑系统架构图。
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
显然,这样的系统存在一些挑战:
- 主订阅者如何向故障转移订阅者表明它正在处理请求?
- 故障转移订阅者如何检测到主订阅者没有收到请求并需要开始处理它?
- 故障转移订阅者如何阻止主订阅者突然恢复在线并接收请求?
- 如何处理主订阅者和故障转移订阅者之间的同步问题?
如果这样的方案已经存在现有的解决方案,我宁愿不必重新发明轮子。所以,我的第一个问题是是否已经有一些东西了?
如果没有,那么我正在考虑使用具有强一致性读取的 DynamoDB 作为主订阅者和故障转移订阅者之间的中介。那么,我的第二个问题是是否有任何完善的计划来做到这一点?