Como configurar assinantes principais e de failover do MQTT para uma fila de tarefas com o AWS IoT?

11

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:

  1. Como o assinante principal indica ao assinante de failover que está trabalhando na solicitação?
  2. Como o assinante de failover detecta que o assinante principal não atendeu à solicitação e precisa começar a trabalhar nela?
  3. Como o assinante de failover impede o assinante principal, caso ele repentinamente fique on-line e atenda à solicitação?
  4. 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?

Paul Grinberg
fonte
Você já investigou se uma fila de mensagens como o Amazon SQS pode ser útil aqui? Parece ter integrações com o AWS IoT e parece adequado para um problema de estilo da 'fila de trabalho'.
Aurora0001

Respostas:

8

De acordo com a documentação do AWS SQS (como você disse que o broker é AWS), isso deve ser nativo:

Imediatamente após o recebimento da mensagem, ela permanece na fila. Para impedir que outros consumidores processem a mensagem novamente, o Amazon SQS define um tempo limite de visibilidade, um período durante o qual o Amazon SQS impede que outros componentes consumidores recebam e processem a mensagem.

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.

Tensibai
fonte
7

Você pode querer examinar o conceito de filas de mensagens não entregues do AWS SQS . Nos documentos da AWS:

Uma fila de devoluções é uma fila que outras filas (de origem) podem direcionar para mensagens que não podem ser processadas (consumidas) com êxito. Você pode anular e isolar essas mensagens na fila de devoluções para determinar por que o processamento deles não teve êxito.

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.

Dawny33
fonte