Qual é a prática recomendada para mover mensagens de uma fila de mensagens não entregues de volta para a fila original no Amazon SQS?
Seria
- Obter mensagem de DLQ
- Escreva a mensagem na fila
- Excluir mensagem de DLQ
Ou existe uma maneira mais simples?
Além disso, a AWS eventualmente terá uma ferramenta no console para mover as mensagens do DLQ?
amazon-web-services
amazon-sqs
Matt Dell
fonte
fonte
Respostas:
Aqui está um hack rápido. Definitivamente, essa não é a melhor opção nem a recomendada.
fonte
Existem alguns scripts que fazem isso para você:
fonte
npx replay-aws-dlq DL_URI MAIN_URI
Não precisa mover a mensagem porque ela virá com muitos outros desafios, como mensagens duplicadas, cenários de recuperação, mensagem perdida, verificação de eliminação de duplicação e etc.
Aqui está a solução que implementamos -
Normalmente, usamos o DLQ para erros transitórios, não para erros permanentes. Então, peguei a abordagem abaixo -
Leia a mensagem do DLQ como uma fila normal
BenefíciosEm seguida, siga o mesmo código que a fila regular está seguindo.
Mais confiável no caso de abortar o trabalho ou o processo foi encerrado durante o processamento (por exemplo, instância interrompida ou processo encerrado)
BenefíciosEstenda a visibilidade da mensagem para que nenhum outro thread as processe.
BeneficiarExclua a mensagem apenas quando houver um erro permanente ou com êxito.
Beneficiarfonte
Essa parece ser sua melhor opção. Existe a possibilidade de que o seu processo falhe após a etapa 2. Nesse caso, você acabará copiando a mensagem duas vezes, mas seu aplicativo deve lidar com a reenvio de mensagens (ou não se importar) de qualquer maneira.
fonte
aqui:
fonte
Existe uma outra maneira de fazer isso sem escrever uma única linha de código. Considere que o nome real da fila é SQS_Queue e o DLQ para ele é SQS_DLQ. Agora siga estas etapas:
fonte
aws sqs receive-message --queue-url <url of DLQ> --max-number-of-messages 10
. Como as mensagens máximas podem ser lidas em maiúsculas em 10, sugiro executar o comando em um loop como este:for i in {1..1000}; do <CMD>; done
Eu escrevi um pequeno script python para fazer isso, usando boto3 lib:
você pode obter este script neste link
esse script basicamente pode mover mensagens entre quaisquer filas arbitrárias. e suporta filas fifo, assim como você pode abastecer o
message_group_id
campo.fonte
Usamos o seguinte script para redirecionar a mensagem da fila src para a fila tgt:
nome do arquivo:
redrive.py
uso:
python redrive.py -s {source queue name} -t {target queue name}
fonte
DLQ entra em ação apenas quando o consumidor original não consegue consumir a mensagem com sucesso após várias tentativas. Não queremos excluir a mensagem, pois acreditamos que ainda podemos fazer algo com ela (talvez tentar processá-la novamente ou registrá-la ou coletar algumas estatísticas) e não queremos continuar encontrando esta mensagem repetidamente e impedir a capacidade de processar outras mensagens por trás desta.
DLQ nada mais é que outra fila. O que significa que precisaríamos escrever um consumidor para DLQ que idealmente seria executado com menos frequência (em comparação com a fila original) que consumiria de DLQ e produziria a mensagem de volta para a fila original e a excluiria de DLQ - se esse for o comportamento pretendido e nós pensamos o consumidor original estaria agora pronto para processá-lo novamente. Deve estar tudo bem se este ciclo continuar por um tempo, pois agora também temos a oportunidade de inspecionar manualmente e fazer as alterações necessárias e implantar outra versão do consumidor original sem perder a mensagem (dentro do período de retenção de mensagem, é claro - que é de 4 dias até padrão).
Seria bom se a AWS fornecesse esse recurso pronto para uso, mas ainda não o vejo - eles estão deixando isso para o usuário final usá-lo da maneira que achar adequada.
fonte