Eu tenho um sistema em que um cliente (vamos chamá-lo de ClientA) pode publicar solicitações para um tópico específico do MQTT. O corretor, caso isso importe, é o Amazon Web Services. Depois, tenho outro cliente (vamos chamá-lo de MainSubscriber), que sempre é inscrito no mesmo tópico, para que possa captar solicitações do ClientA e fazer algum trabalho que, no final, se transforma em uma operação de banco de dados. O banco de dados, caso isso importe, é o DynamoDB.
Como o MainSubscriber nem sempre pode ser acessível / on-line, há um desejo de que um assinante de failover seja o backup de failover do assinante principal. A idéia é que, se o assinante principal não manipular a solicitação em tempo hábil, o assinante de failover entrará em ação e fará a operação de trabalho / banco de dados equivalente. O desafio é que o "trabalho" e a "operação do banco de dados" resultante não devem ser duplicados pelos assinantes principal e de failover.
Aqui está um desenho lógico da arquitetura do sistema para este sistema.
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
Claramente, existem alguns desafios com esse sistema:
- Como o assinante principal indica ao assinante de failover que está trabalhando na solicitação?
- Como o assinante de failover detecta que o assinante principal não atendeu à solicitação e precisa começar a trabalhar nela?
- Como o assinante de failover impede o assinante principal, caso ele repentinamente fique on-line e atenda à solicitação?
- Como lidar com problemas de sincronicidade entre assinantes principais e de failover?
Eu preferiria não ter que reinventar a roda se já existir uma solução para esse esquema. Então, minha primeira pergunta é se já existe algo lá fora?
Caso contrário, estava pensando em usar o DynamoDB com leituras fortemente consistentes para atuar como mediador entre o assinante principal e o failover. Então, minha segunda pergunta é se existe algum esquema bem estabelecido para fazer isso?
Respostas:
De acordo com a documentação do AWS SQS (como você disse que o broker é AWS), isso deve ser nativo:
O problema é encontrar o tempo limite de visibilidade correto, de acordo com o tempo máximo de processamento.
Você ainda tem uma pequena chance de que o assinante processe a mesma mensagem; nesse caso, o código do assinante deve tentar criar uma saída idempotente para o banco de dados (pelo menos a mesma chave primária) e deve lidar com uma falha normal ao tentar inserir o mesmo registro.
fonte
Você pode querer examinar o conceito de filas de mensagens não entregues do AWS SQS . Nos documentos da AWS:
Portanto, se você apontar o assinante principal para escutar na fila normal e o secundário para escutar na fila de mensagens não entregues, o problema de failover deverá ser resolvido.
Além disso, com isso, 1, 2 e 3 de seus problemas são resolvidos. Os assinantes principal e secundário não precisam conversar entre si nesse caso.
Além disso, com base na resposta de Tensibai, verifique se o código do assinante está escrito para receber uma mensagem de cada vez se vários assinantes estiverem ouvindo a mesma fila devido à
visibility timeout
A desvantagem seria que isso introduziria um atraso no processamento; as mensagens entrarão na fila de devoluções somente após algum tempo.
Portanto, caso você não queira isso, pode seguir em frente com a resposta de Tensibai. E se você puder tolerar isso, em vez de ter uma tabela Dynamo extra para verificação de status, poderá usar isso.
fonte