Este tópico explica os conceitos, cenários e a solução para a duração adaptativa de processamento de mensagens durante o consumo.
Conceitos básicos
Visível: A mensagem está disponível na fila. Qualquer consumidor pode recebê-la e processá-la. Um consumidor é um service ou aplicativo que recebe e processa mensagens.
Invisível: Após um único consumidor receber uma mensagem, ela se torna invisível e não pode ser recebida por outros consumidores. Isso impede que outros consumidores processem a mesma mensagem.
Período de tempo limite de visibilidade: O intervalo entre o momento em que um consumidor recebe uma mensagem (tornando-a invisível para outros consumidores) e o momento em que ela pode ser recebida novamente por outros consumidores (tornando-se visível).
Quando um único consumidor recebe uma mensagem, ela se torna invisível e não pode ser recebida por outros consumidores. Esse status invisível depende do período de tempo limite de visibilidade, que impede que outros consumidores processem a mesma mensagem.
Para obter mais informações sobre o período de tempo limite de visibilidade, consulte Visibility Timeout.
Cenários
O Simple Message Queue (formerly MNS) define um período de tempo limite de visibilidade padrão para cada mensagem. A contagem regressiva começa assim que um consumidor recebe uma mensagem. Se o consumidor não conseguir processar a mensagem dentro do período de tempo limite de visibilidade, outro consumidor poderá recebê-la e processá-la. Esse tempo limite é vantajoso porque as mensagens devem ser explicitamente excluídas após o processamento. Caso ocorra um evento anormal, como a falha do processo do consumidor, a mensagem ainda poderá ser processada por outro consumidor.
Alguns usuários definem um longo período de tempo limite de visibilidade padrão para uma fila a fim de garantir que a mensagem não seja liberada antes que o consumidor termine de processá-la. Por exemplo, suponha que o período de tempo limite de visibilidade de uma fila esteja definido como 6 horas. Um consumidor recebe e processa a mensagem M1. Se o processo falhar ou a máquina reiniciar, a mensagem M1 não poderá ser recebida e processada por outro consumidor por pelo menos 6 horas. Escrever código personalizado para lidar com essas falhas aumenta a complexidade do programa.
Em cenários que exigem alta performance em tempo real e respostas rápidas para cada mensagem, o consumo de mensagens deve atender aos seguintes objetivos:
O período de tempo limite de visibilidade da fila é curto. Se um processo falhar, outro consumidor poderá receber e processar a mensagem pendente após o término desse curto período de tempo limite de visibilidade.
As mensagens não devem atingir o tempo limite durante o processamento. Por exemplo, se um consumidor levar mais de 5 minutos para processar uma mensagem, ela não deverá expirar durante esse processo.
Solução
O SDK C# fornecido pelo Simple Message Queue (formerly MNS) consegue lidar com esse cenário. A solução consiste em verificar periodicamente se uma operação ChangeVisibility é necessária para a mensagem enquanto o consumidor a processa. Após concluir o processamento, o consumidor ainda precisa excluir ativamente a mensagem.
Para obter o link de download do SDK C#, consulte C++ SDK. Se você encontrar problemas com a demonstração, envie um ticket.
Os pontos a seguir se aplicam ao programa:
Antes de executar o programa, especifique o
accessId, aaccessKeye oEndPoint.-
Descrições das variáveis:
Variável
Descrição
MessageMinimalLife
A duração mínima de vida útil que uma mensagem deve ter ao ser registrada. Por exemplo, se restarem apenas 0,1 segundos do período de tempo limite de uma mensagem quando ela for registrada, não haverá tempo suficiente para estender sua vida útil com
ChangeVisibility. Portanto,MessageMinimalLifegarante que a mensagem sobreviva por tempo suficiente para queChangeVisibilityseja chamado. Defina esse valor conforme necessário com base na carga de trabalho do seu negócio.TimerInterval
O intervalo do timer interno no Manager. Garanta que o timer inicie antes que a vida útil restante da mensagem atinja
MessageMinimalLife. É possível definir um intervalo curto, mas isso resulta em verificações mais frequentes.QueueMessageVisibilityTimeout
O período de tempo limite de visibilidade padrão para uma mensagem. Esta é uma propriedade da fila. Cada vez que
ChangeVisibilityé chamado, o período de tempo limite de visibilidade da mensagem é redefinido paraQueueMessageVisibilityTimeout. Portanto, seu valor deve ser maior queTimerInterval+MessageMinimalLifepara garantir que a mensagem não atinja o tempo limite.MessageTimeout
O período de tempo limite para uma mensagem dentro do Manager. Por exemplo, se um consumidor travar e uma mensagem não for processada após 5 horas (supondo que 5 horas seja muito mais longo que o tempo normal de processamento), o Manager para de chamar
ChangeVisibilitypara essa mensagem e permite que o tempo de visibilidade dela expire. -
Descrição do fluxo:
Após receber uma mensagem, o consumidor primeiro a registra, depois a processa e, por fim, chama o método
deleteMessagedo Manager.Quando uma mensagem é registrada pela primeira vez, o Manager usa o ThreadPool para agendar um
ChangeVisibilityTaska fim de verificar se uma operaçãoChangeVisibilityé necessária. O Manager também adiciona a mensagem à sua lista interna de mensagens.O timer interno do Manager usa periodicamente
Parallelpara iniciar umChangeVisibilityTaskque verifica todas as mensagens na lista.-
As operações específicas relacionadas a Manager.ChangeMessageVisibility (ChangeVisibilityTask) são mostradas no fluxograma.
O fluxograma é o seguinte:
Instruções
Leia o conteúdo em inglês para entender O QUE precisa ser comunicado
Escreva o português brasileiro DO ZERO — esqueça a estrutura das frases em inglês
Preserve toda a formatação markdown, blocos de código, links e imagens exatamente como estão
Copie os placeholders xref (
{XREF_N}) literalmente, NÃO os traduza ou modifiqueAplique todas as regras específicas do idioma rigorosamente
Aplique as regras de stopwords com tolerância zero
Use o modo imperativo em etapas numeradas e listas de procedimentos
Garanta a consistência terminológica — o mesmo termo deve ter a mesma tradução em todo o documento
Varie os inícios das frases em listas e tabelas — nenhum início deve ser repetido mais de 3 vezes
Retorne APENAS o documento markdown em português brasileiro, sem explicações