Por que minha fila FIFO do Amazon SQS não retorna todas as mensagens ou mensagens de outros grupos de mensagens?
Minha fila primeiro a entrar, primeiro a sair (FIFO) do Amazon Simple Queue Service (Amazon SQS) não retorna algumas mensagens quando eu chamo a API ReceiveMessage.
Resolução
Ao usar filas FIFO, você não pode solicitar o recebimento de mensagens de um ID de grupo de mensagens específico. Você também não pode filtrar a chamada de API ReceiveMessage para retornar somente mensagens de um grupo de mensagens por vez.
Quando você especifica um parâmetro MaxNumberOfMessages na chamada de API ReceiveMessage, o SQS retorna o máximo possível de mensagens com o mesmo ID de grupo de mensagens. A chamada de API ReceiveMessage também pode retornar mensagens de outros grupos de mensagens disponíveis.
Para filas FIFO, ao receber mensagens que pertencem a um determinado ID de grupo de mensagens, observe estas diretrizes:
- Você deve excluir as mensagens no ID do grupo de mensagens atual antes de poder receber mais mensagens do mesmo ID do grupo de mensagens.
- As mensagens recebidas, mas ainda não excluídas, estão no estado em andamento. As mensagens em andamento bloqueiam a entrega das mensagens disponíveis do mesmo grupo de mensagens.
- Um motivo comum para as mensagens estarem no estado em andamento é uma falha inesperada do cliente consumidor. Outro motivo é quando a função de consumidor posterior do AWS Lambda encontrou exceções ou atingiu sua simultaneidade máxima.
- A API ChangeMessageVisibility pode estender ou reduzir o período de tempo limite de visibilidade de mensagens em andamento.
- Você pode aguardar até que o período de tempo limite de visibilidade de mensagens expire para permitir a nova entrega de mensagens.
Para todas as filas FIFO e limites de cota do Amazon SQS, observe estas diretrizes:
- As filas FIFO têm no máximo 20.000 mensagens em andamento.
Observação: o Amazon SQS não retorna mensagens de erro que excedam os limites da cota. - As filas FIFO podem processar até 300 transações por segundo (TPS) sem a ativação do throughput elevado. Solicitações acima de 300 TPS recebem o erro "ThrottlingException" mesmo se as mensagens na fila estiverem disponíveis.
- As mensagens da fila FIFO do SQS são armazenadas em partições. Cada partição suporta até 300 TPS para operações de envio, recebimento e exclusão. Para obter mais informações, consulte Otimizando a utilização de partições.
- É possível que filas FIFO com throughput elevado compartilhem uma partição com vários grupos de mensagens. Se um grupo de mensagens exceder 300 TPS em sua partição, as mensagens de outros grupos nessa partição não serão entregues devido ao controle de utilização.
- As transações de throughput elevado da fila FIFO por segundo variam de acordo com a região da AWS. Para obter mais informações, consulte Cotas relacionadas a mensagens.
Para reduzir o limite de throughput do Amazon SQS em filas FIFO, observe estas diretrizes:
- Use as ações em lote de API do Amazon SQS SendMessageBatch, DeleteMessageBatch e ChangeMessageVisibilityBatch para reduzir custos ou alterar até dez mensagens. Para a API ReceiveMessage, defina o parâmetro MaxNumberofMessages para receber até dez mensagens por transação. Para obter mais informações, consulte Ações em lote do Amazon SQS.
- Para filas FIFO com throughput elevado, siga as recomendações para otimizar a utilização da partição. Envie mensagens com os mesmos IDs de grupo de mensagens em lotes. Exclua mensagens ou altere os valores de tempo limite de visibilidade de mensagens em lotes com identificadores de recebimento das mesmas solicitações de API ReceiveMessage.
- Ative o throughput elevado para filas FIFO.
- Para filas FIFO com throughput elevado, use um MessageGroupId com vários valores exclusivos. Isso permite uma distribuição uniforme entre partições de filas FIFO. Para obter mais informações, consulte Usar o ID do grupo de mensagens do Amazon SQS.
Uma fila FIFO examina as primeiras 20.000 mensagens para determinar o grupo de mensagens disponível. Se os grupos de mensagens nas primeiras 20.000 mensagens estiverem bloqueados por causa de mensagens em andamento, as mensagens de outros grupos além das primeiras 20.000 não serão retornadas. Para obter mais informações, consulte Evitar ter um grande backlog de mensagens com o mesmo ID de grupo de mensagens.
Exemplo A
Uma fila FIFO tem um total de 20.001 mensagens. As primeiras 20.000 mensagens pertencem ao grupo de mensagens 1 e a última mensagem pertence ao grupo de mensagens 2. Ao tentar receber mensagens da fila, você recebe uma mensagem somente do grupo 1. Todas as chamadas de API ReceiveMessage consecutivas resultam em recebimentos vazios. Isso acontece porque o FIFO examina somente as mensagens que pertencem ao grupo 1 e esse grupo está bloqueado pela chamada atual.
Exemplo B
Uma fila FIFO tem um total de 20.000 mensagens. As primeiras 19.999 mensagens pertencem ao grupo de mensagens 1 e a última mensagem pertence ao grupo de mensagens 2. Quando você tenta receber mensagens da fila, a primeira chamada ReceiveMessage recebe uma mensagem que pertence ao grupo 1. A segunda chamada ReceiveMessage recebe uma mensagem que pertence ao grupo 2. Qualquer chamada ReceiveMessage adicional resulta em recebimentos vazios porque os dois grupos agora estão bloqueados pelas chamadas atuais.
Informações relacionadas
Filas FIFO (primeiro a entrar, primeiro a sair) do Amazon SQS
Conteúdo relevante
- AWS OFICIALAtualizada há 3 anos
- AWS OFICIALAtualizada há 3 anos