Para garantir a confiabilidade da interação em cenários de instabilidade de rede ou anomalias no servidor, os clientes do Simple Message Queue (SMQ, formerly MNS) implementam políticas de confiabilidade que abrangem tanto o produtor quanto o consumidor.
Produtor: mecanismo de nova tentativa
-
Tipos de exceção e gatilho de nova tentativa
Tipos de exceção: identifique e categorize as exceções de cliente (
MNS ClientException, como timeouts de rede ou erros de limitação de taxa) e as exceções de servidor (ServerException). Diferencie os erros que permitem nova tentativa (por exemplo, códigos de erro 5xx ou instabilidade de rede) daqueles que não permitem (por exemplo, recurso inexistenteQueueNotExist).Novas tentativas pelo cliente conforme necessário: para reenviar mensagens quando preciso, crie uma lógica de nova tentativa no código de negócio com base nos requisitos da sua aplicação.
-
Política de backoff
Recomendamos implementar uma política de backoff exponencial (por exemplo, começando em 1 segundo, com limite máximo de 60 segundos) combinada com uma política de jitter aleatório. Essa abordagem evita um volume excessivo de novas tentativas no nível do cluster.
Consumidor: mecanismo de nova tentativa
-
Nova tentativa automática
Em casos de falha no consumo (por exemplo, mensagens não confirmadas explicitamente ou timeout de consumo), o SMQ reentrega automaticamente as mensagens com base no período de timeout de visibilidade das filas quando o cliente busca novas mensagens.
-
Design de idempotência no consumidor
Projete a lógica de negócio para ser naturalmente idempotente (por exemplo, deduplicação por meio de uma chave única no banco de dados) ou verifique se a mensagem já foi consumida com base no identificador único da mensagem
MessageIdcombinado ao estado do serviço.
-
Tratamento de exceções
Ao encontrar exceções na lógica de consumo de mensagens, não envie uma mensagem de confirmação (ACK). Em vez disso, permita que o SMQ reentregue a mensagem até que ela seja consumida com sucesso; nesse momento, chame a operação
DeleteMessagepara excluir a mensagem.
Referências
Para exemplos de código em Java, consulte Receber mensagens de uma fila.