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 Sequence​Number 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 valor SequenceNumber é um inteiro exclusivo de 64 bits atribuído a uma mensagem à medida que ela é 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 48/64 bits 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 (por mínima que seja) 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 na propriedade EnqueuedTimeUtc . 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 Scheduled​Enqueue​Time​Utc 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 SequenceNumber da mensagem agendada, 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 de uma mensagem agendada só é válido enquanto a mensagem estiver nesse estado. À 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.

Nota

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 esta condição de corrida, recomenda-se evitar agendar operações de ativação e cancelamento em estreita sucessão.

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, 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, semanas ou meses 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.

Próximos passos

Para saber mais sobre as mensagens do Service Bus, consulte os seguintes tópicos:

Recurso adicional