Compartilhar via


Carimbos de data/hora e sequenciamento de mensagem

O sequenciamento e o carimbo de data/hora são dois recursos que estão sempre habilitados em todas as entidades do Barramento de Serviço e na superfície por meio das propriedades Sequence​Number e EnqueuedTimeUtc das mensagens recebidas ou procuradas.

Para os casos nos quais a ordem absoluta de mensagens é significativa e/ou nos quais um consumidor precisa de um identificador exclusivo confiável para mensagens, o agente aplica selo nas mensagens com um número de sequência crescente e sem lacunas relacionado à fila ou ao tópico. Para entidades particionadas, o número da sequência é emitido com relação à partição.

Número de sequência

O valor SequenceNumber é um inteiro de 64 bits exclusivo atribuído a uma mensagem conforme ela é aceita e armazenada pelo agente e por funções como seu identificador interno. Para entidades particionadas, os 16 bits de nível mais alto refletem o identificador da partição. Os números de sequência são revertidos para zero quando o intervalo de 64 bits ou 48 bits (excluindo 16 bits para o identificador de partição) é esgotado.

O número sequencial pode ser considerado confiável como identificador exclusivo, pois é atribuído por uma autoridade central e neutra, e não pelos clientes. Ele também representa a ordem verdadeira de chegada e é mais preciso do que um carimbo de data/hora enquanto critério de ordem, porque os carimbos de data/hora não podem ter uma resolução alta o suficiente em taxas de mensagens extremas e podem estar sujeitos a (embora mínima) distorção do relógio em situações em que a propriedade do agente faz a transição entre os nós.

A ordem de chegada absoluta é importante. Por exemplo, nos cenários comerciais, nos quais um número limitado de bens oferecidos são servidos por ordem de chegada enquanto durarem; as vendas de tíquete conjuntas são um exemplo.

Timestamp

A capacidade de carimbo de data/hora funciona 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 será útil se um cenário de negócios depender de prazos, como, por exemplo, se um item de trabalho foi enviado em uma determinada data antes da meia-noite, mas o processamento está muito atrás na lista de pendências da fila.

Observação

O número de sequência por si só garante a ordem de enfileiramento e a ordem de mensagens do extrator, mas não a ordem de processamento, que requer sessões.

Digamos que haja 5 mensagens na fila e 2 consumidores. O consumidor 1 pega a mensagem 1. O consumidor 2 pega a mensagem 2. O consumidor 2 conclui 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 conclui o processamento da mensagem 3, mas o consumidor 1 ainda não terminou o processamento da mensagem 1. Por fim, o consumidor 1 conclui o processamento da mensagem 1. Portanto, as mensagens foram processadas nesta ordem: mensagem 2, mensagem 3 e mensagem 1. Se você precisar que as mensagens 1, 2 e 3 sejam processadas em ordem, será necessário usar sessões.

Portanto, se as mensagens só precisarem ser recuperadas em ordem, não será necessário usar sessões. Se as mensagens precisarem ser processadas em ordem, use sessões. A mesma ID de sessão deve ser definida em mensagens que são associadas, que podem ser as mensagens 1, 4 e 8 em um conjunto e 2, 3 e 6 em outro.

Para obter mais informações, confira Sessões de mensagem do Barramento de Serviço.

Mensagens agendadas

É possível enviar mensagens a uma fila ou a um tópico para processamento atrasado; por exemplo, para agendar a disponibilidade de um trabalho para processamento por um sistema em um determinado momento. Essa capacidade detecta um confiável agendador distribuído baseado em tempo.

As mensagens agendadas não são materializadas na fila até o tempo de enfileiramento definido. Antes disso, 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 propriedade Scheduled​Enqueue​Time​Utc 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ê poderá 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 pesquisa de mensagens.

O SequenceNumber de uma mensagem agendada só é válido enquanto a mensagem está no estado agendado. Conforme a mensagem faz a transição para o estado ativo, a mensagem é acrescentada à fila como se ela tivesse sido enfileirada no instante atual, 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 Barramento de Serviço não dá suporte a agendamentos recorrentes para mensagens.

Observação

  • O tempo de enfileiramento da mensagem não significa que a mensagem será enviada ao mesmo tempo. Ele será enfileirado, mas o tempo real de envio depende da carga de trabalho da fila e do 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 simultaneamente cancelada, o processo de ativação não será revertido e a mensagem ainda será ativada. Além disso, isto pode potencialmente 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.

Usar 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 dois fatores, tempos limite de uma hora para os usuários confirmarem seus endereços de email e componentes de tempo de vários dias, semanas ou meses em domínios como bancários 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 em um momento posterior. Estruturas como NServiceBus e MassTransit facilitam a integração de todos esses elementos.

Para saber mais sobre as mensagens do Barramento de Serviço, consulte os seguintes tópicos: