Tengo un sistema donde un cliente (llamémoslo ClientA) puede publicar solicitudes a un tema MQTT particular. El corredor, en caso de que sea importante, es Amazon Web Services. Luego tengo otro cliente (llamémoslo MainSubscriber) que siempre está suscrito al mismo tema para que pueda recibir solicitudes de ClientA y hacer un trabajo que, al final, se convierte en una operación de base de datos. La base de datos, en caso de que sea importante, es DynamoDB.
Dado que MainSubscriber puede no estar siempre accesible / en línea, existe el deseo de tener un suscriptor de conmutación por error para que sea la copia de seguridad de conmutación por error del suscriptor principal. La idea es que si el suscriptor principal no maneja la solicitud de manera oportuna, entonces el suscriptor de conmutación por error se activará y realizará la operación equivalente de trabajo / base de datos. El desafío es que el "trabajo" y la "operación de la base de datos" resultante no deben ser duplicados por los suscriptores principales y de conmutación por error.
Aquí hay un dibujo de arquitectura de sistema lógico para este sistema.
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
Claramente, hay algunos desafíos con este sistema:
- ¿Cómo le indica el suscriptor principal al suscriptor de conmutación por error que está trabajando en la solicitud?
- ¿Cómo detecta el suscriptor de conmutación por error que el suscriptor principal no ha recibido la solicitud y necesita comenzar a trabajar en ella?
- ¿Cómo detiene el suscriptor de conmutación por error el suscriptor principal en caso de que de repente vuelva a estar en línea y responda a la solicitud?
- ¿Cómo lidiar con los problemas de sincronía entre los suscriptores principales y de conmutación por error?
Preferiría no tener que reinventar la rueda si ya existe una solución existente para tal esquema. Entonces, mi primera pregunta es si ya hay algo por ahí.
De lo contrario, estaba pensando en usar DynamoDB con lecturas muy consistentes para actuar como mediador entre el suscriptor principal y el de conmutación por error. Entonces, mi segunda pregunta es si hay algún esquema bien establecido para hacer esto.