Estrangulamento SQS ter um máximo de 1 em voo mensagem de atravessar todos os assinantes?

votos
1

Eu tenho uma situação onde eu estou desencadeando um processo de longa duração em um Microservice por uma mensagem sqs. Eu tenho várias instâncias do mesmo Microservice mas eu só quero uma instâncias para executar a tarefa. Existe uma maneira de especificar que a fila só deve entregar uma mensagem e esperar até que respondem assinante ou atingir o tempo limite de visibilidade?

obrigado

Publicado 18/12/2018 em 11:09
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

SQS já faz isso para você. O atributo "tempo limite de visibilidade" garante que a tarefa só é visível a 1 trabalhador se alinhar com o tempo máximo de execução.

O trabalhador vai buscar o objeto do SQS. SQS garante que ele só é entregue uma vez e invisível para os outros no tempo do tempo limite de visibilidade. Você deve dar um tempo máximo de execução para a tarefa. Vamos dizer 5 minutos. E colocar um tempo limite de visibilidade superior. Vamos dizer 6 minutos. Após este tempo, se o trabalhador não executado com sucesso a tarefa o item será invisível para os outros por mais um minuto e depois voltar para a fila. Após este outro trabalhador pode pegar a mensagem e é invisível para os outros para 6 minutos novamente. Em caso de sucesso o trabalhador deve remover a mensagem.

Desta forma você garante que cada item só é mais processado.

Respondeu 18/12/2018 em 11:23
fonte usuário

votos
0

Quero enviar uma mensagem apenas para SubscriberA e esperar até que o processo SubscriberA a mensagem completamente ou até que o tempo limite. Eu não posso ver como evitar o subscriberB para pegar outra mensagem da fila até terminar SubscriberA

É estranho que você tem uma arquitetura assim. Isso vai fazer uso de um assinante em um momento assim uma frota de assinante / multi-instância Microservice não é apropriado.

Se for possível, por favor, deixe um de seus microservices inscrever / sondagem da fila

Caso contrário, você terá a ele em seu próprio país. Minha sugestão:

  • Tem dois fila. Um dos fila receberia todas as mensagens. Um dos fila serviria a mensagem para seus assinantes. Sua base de código não terá que mudar muito se é set-up como este
  • Configurar uma função Lambda ativado ao receber-SQS. Defina a simultaneidade dessa função a 1, ajuste o atraso na entrega de seus SQS para estrangular como você deseja
  • A função precisa verificar a dose-SQS se existe uma mensagem em que fila (Waitting ou a ser processado) através da GetQueueAttributes API
  • Envie a mensagem da Dose-SQS se é livre ou retornar a mensagem de volta para Receber-SQS
Respondeu 19/12/2018 em 06:37
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more