Sequência de mensagens e carimbos de data/hora
O sequenciamento e o carimbo de data/hora são dois recursos que estão sempre habilitados em todas as entidades do Service Bus e aparecem através SequenceNumber
das propriedades e EnqueuedTimeUtc
das mensagens recebidas ou navegadas.
Para os casos em que a ordem absoluta das mensagens é significativa e/ou em que um consumidor precisa de um identificador único confiável para as mensagens, o corretor carimba as mensagens com um número de sequência crescente e sem lacunas em relação à fila ou tópico. Para entidades particionadas, o número de sequência é emitido em relação à partição.
Número de sequência
O SequenceNumber
valor é um inteiro exclusivo de 64 bits atribuído a uma mensagem à medida que é aceita e armazenada pelo broker e funciona como seu identificador interno. Para entidades particionadas, os 16 bits superiores refletem o identificador de partição. Os números de sequência passam para zero quando o intervalo de 64 bits ou 48 bits (excluindo 16 bits para o identificador de partição) se esgota.
O número sequencial pode ser considerado um identificador único, uma vez que é atribuído por uma autoridade central e neutra e não pelos clientes. Ele também representa a verdadeira ordem de chegada e é mais preciso do que um carimbo de data/hora como critério de ordem, porque os carimbos de data/hora podem não ter uma resolução alta o suficiente em taxas de mensagem extremas e podem estar sujeitos a distorção de relógio (ainda que mínima) em situações em que a propriedade do corretor transita entre nós.
A ordem absoluta de chegada é importante, por exemplo, em cenários de negócios em que um número limitado de mercadorias oferecidas é servido por ordem de chegada enquanto durarem os estoques; A venda de bilhetes para concertos é um exemplo.
Carimbo de Data/Hora
O recurso de carimbo de data/hora atua como uma autoridade neutra e confiável que captura com precisão a hora UTC de chegada de uma mensagem, refletida EnqueuedTimeUtc
na propriedade. O valor é útil se um cenário de negócios depender de prazos, como se um item de trabalho foi enviado em uma determinada data antes da meia-noite, mas o processamento está muito atrás da lista de pendências da fila.
Nota
O número de sequência por si só garante a ordem de fila e a ordem do extrator de mensagens, mas não a ordem de processamento, que requer sessões.
Digamos, há 5 mensagens na fila e 2 consumidores. O consumidor 1 capta a mensagem 1. O consumidor 2 pega a mensagem 2. O consumidor 2 termina o processamento da mensagem 2 e pega a mensagem 3, enquanto o consumidor 1 ainda não terminou o processamento da mensagem 1. O consumidor 2 termina o processamento da mensagem 3, mas o consumidor 1 ainda não terminou o processamento da mensagem 1. Finalmente, o consumidor 1 conclui o processamento da mensagem 1. Assim, as mensagens são processadas nesta ordem: mensagem 2, mensagem 3 e mensagem 1. Se você precisar que as mensagens 1, 2 e 3 sejam processadas em ordem, você precisará usar sessões.
Assim, se as mensagens só precisam ser recuperadas em ordem, você não precisa usar sessões. Se as mensagens precisarem ser processadas em ordem, use sessões. O mesmo ID de sessão deve ser definido em mensagens que pertencem juntas, que podem ser as mensagens 1, 4 e 8 em um conjunto e 2, 3 e 6 em outro conjunto.
Para obter mais informações, consulte Sessões de mensagens do Service Bus.
Mensagens agendadas
Pode submeter mensagens para uma fila ou tópico para processamento adiado; por exemplo, para agendar uma tarefa para ficar disponível para processamento por um sistema a determinada hora. Esse recurso realiza um agendador distribuído confiável baseado em tempo.
As mensagens agendadas não se materializam na fila até o tempo de fila definido. Antes desse horário, as mensagens agendadas podem ser canceladas. O cancelamento exclui a mensagem.
Você pode agendar mensagens usando qualquer um de nossos clientes de duas maneiras:
- Use a API de envio regular, mas defina a
ScheduledEnqueueTimeUtc
propriedade na mensagem antes de enviar. - Use a API de mensagem de agendamento, passe a mensagem normal e a hora agendada. A API retorna o , da mensagem agendada,
SequenceNumber
que você pode usar posteriormente para cancelar a mensagem agendada, se necessário.
As mensagens agendadas e seus números de sequência também podem ser descobertos usando a navegação por mensagens.
O SequenceNumber
para uma mensagem agendada só é válido enquanto a mensagem estiver no estado agendado. À medida que a mensagem transita para o estado ativo, a mensagem é anexada à fila como se tivesse sido enfileirada no instante atual, o que inclui a atribuição de um novo SequenceNumber
.
Como o recurso está ancorado em mensagens individuais e as mensagens só podem ser enfileiradas uma vez, o Service Bus não oferece suporte a agendamentos recorrentes para mensagens.
Nota
- O tempo de enfileiramento da mensagem não significa que a mensagem será enviada ao mesmo tempo. Ele ficará enfileirado, mas o tempo real de envio depende da carga de trabalho da fila e de seu estado.
- Devido a considerações de desempenho, a ativação e o cancelamento de mensagens agendadas são operações independentes sem bloqueio mútuo. Se uma mensagem estiver em processo de ativação e for cancelada simultaneamente, o processo de ativação não será revertido e a mensagem ainda será ativada. Além disso, isso pode levar a uma contagem negativa de mensagens agendadas. Para minimizar essa condição de corrida, recomendamos que você evite agendar operações de ativação e cancelamento em sucessão próxima.
Usando mensagens agendadas com fluxos de trabalho
É comum ver fluxos de trabalho de negócios de execução mais longa que têm um componente de tempo explícito para eles, como tempos limite de 5 minutos para autenticação de 2 fatores, tempos limite de uma hora para usuários confirmando seu endereço de e-mail e componentes de tempo de vários dias, semana ou mês em domínios como bancos e seguros.
Esses fluxos de trabalho geralmente são iniciados pelo processamento de alguma mensagem, que armazena algum estado e, em seguida, agenda uma mensagem para continuar o processo posteriormente. Frameworks como NServiceBus e MassTransit facilitam a integração de todos esses elementos juntos.
Conteúdos relacionados
Para saber mais sobre as mensagens do Service Bus, consulte os seguintes tópicos: