Timestamp e sequenze di messaggi

La sequenziazione e il timestamp sono due funzionalità sempre abilitate in tutte le entità bus di servizio e vengono visualizzate tramite le Sequence​Number proprietà e EnqueuedTimeUtc dei messaggi ricevuti o esplorati.

Per i casi in cui l'ordine assoluto dei messaggi è significativo e/o in cui un consumer necessita di un identificatore univoco attendibile per i messaggi, il broker contrassegna i messaggi con un numero di sequenza crescente senza interruzioni in relazione alla coda o all'argomento. Per le entità partizionate, il numero di sequenza viene emesso in relazione alla partizione.

Sequenza numerica

Il valore SequenceNumber è un numero intero univoco a 64 bit assegnato a un messaggio quando viene accettato e archiviato dal broker, usato come identificatore interno. Per le entità partizionate, i primi 16 bit rispecchiano l'identificatore della partizione. I numeri di sequenza ripartono da zero quando l'intervallo di 48/64 bit viene esaurito.

Il numero di sequenza può essere considerato attendibile come identificatore univoco perché è assegnato da un'autorità centrale e neutra e non dai client. Rappresenta inoltre l'effettivo ordine di arrivo ed è più preciso rispetto a un timestamp come criterio di ordinamento, perché i timestamp potrebbero non avere una risoluzione sufficientemente alta in caso di frequenze di messaggi estreme e potrebbero essere soggetti a sfasamento di orario (anche se minimo) in situazioni in cui la proprietà del broker passa tra i nodi.

L'ordine di arrivo assoluto è importante, ad esempio, in scenari aziendali in cui un numero limitato di prodotti in offerta viene fornito a chi prima li richiede, fino all'esaurimento delle scorte, come nel caso di una vendita di biglietti per un concerto.

Timestamp

La funzionalità di timestamp funge da autorità neutra e affidabile che acquisisce in modo accurato l'ora UTC di arrivo di un messaggio, che si riflette nella proprietà EnqueuedTimeUtc. Il valore è utile se uno scenario aziendale dipende da scadenze, ad esempio se un elemento di lavoro è stato inviato in una certa data prima di mezzanotte, ma l'elaborazione è nel backlog della coda.

Nota

Il numero di sequenza garantisce autonomamente l'ordine di accodamento e l'ordine di estrazione dei messaggi, ma non l'ordine di elaborazione, che richiede sessioni.

Ad esempio, ci sono 5 messaggi nella coda e 2 consumer. Il consumer 1 preleva il messaggio 1. Il consumer 2 preleva il messaggio 2. Il consumer 2 termina l'elaborazione del messaggio 2 e preleva il messaggio 3 mentre consumer 1 non è ancora stato eseguito con l'elaborazione del messaggio 1. Il consumer 2 termina l'elaborazione del messaggio 3, ma il consumer 1 non viene ancora eseguito con l'elaborazione del messaggio 1. Infine, il consumer 1 completa l'elaborazione del messaggio 1. I messaggi vengono quindi elaborati in questo ordine: messaggio 2, messaggio 3 e messaggio 1. Se è necessario elaborare il messaggio 1, 2 e 3 in ordine, è necessario usare le sessioni.

Pertanto, se i messaggi devono essere recuperati solo in ordine, non è necessario usare le sessioni. Se i messaggi devono essere elaborati in ordine, usare le sessioni. Lo stesso ID sessione deve essere impostato sui messaggi che appartengono insieme, che possono essere messaggi 1, 4 e 8 in un set e 2, 3 e 6 in un altro set.

Per altre informazioni, vedere bus di servizio sessioni di messaggi.

Messaggi pianificati

È possibile inviare messaggi a una coda o un argomento per l'elaborazione ritardata, ad esempio pianificando un processo in modo che diventi disponibile per l'elaborazione da parte di un sistema a una determinata ora. Questa funzionalità rende disponibile un'affidabile utilità di pianificazione distribuita basata sul tempo.

I messaggi pianificati non vengono materializzati nella coda fino all'ora di accodamento definita. Prima di tale ora, i messaggi pianificati possono essere annullati. L'annullamento comporta l'eliminazione del messaggio.

È possibile pianificare i messaggi usando uno dei nostri client in due modi:

  • Usare l'API di invio normale, ma impostare la Scheduled​Enqueue​Time​Utc proprietà sul messaggio prima dell'invio.
  • Usare l'API del messaggio di pianificazione, passare sia il messaggio normale che l'ora pianificata. L'API restituisce il valore SequenceNumber del messaggio pianificato, che è possibile usare in un secondo momento per annullare il messaggio pianificato, se necessario.

I messaggi pianificati e i relativi numeri di sequenza possono anche essere individuati tramite l'esplorazione dei messaggi.

Il valore SequenceNumber per un messaggio pianificato è valido quando il messaggio si trova in questo stato. Quando il messaggio passa allo stato attivo, il messaggio viene aggiunto alla coda come se fosse stato accodato all'istante corrente, che include l'assegnazione di un nuovo SequenceNumber.

Poiché la funzionalità è ancorata ai singoli messaggi e i messaggi possono essere accodati una sola volta, bus di servizio non supporta pianificazioni ricorrenti per i messaggi.

Nota

Il tempo di accodamento dei messaggi non significa che il messaggio verrà inviato contemporaneamente. Verrà accodato, ma il tempo di invio effettivo dipende dal carico di lavoro della coda e dal relativo stato.

Nota

A causa delle considerazioni sulle prestazioni, l'attivazione e l'annullamento dei messaggi pianificati sono operazioni indipendenti senza blocco reciproco. Se un messaggio è in corso di attivazione e viene annullato contemporaneamente, il processo di attivazione non verrà invertito e il messaggio verrà comunque attivato. Inoltre, questo può potenzialmente portare a un conteggio negativo dei messaggi pianificati. Per ridurre al minimo questa race condition, è consigliabile evitare di pianificare le operazioni di attivazione e annullamento in successione ravvicinata.

Uso di messaggi pianificati con flussi di lavoro

È comune vedere flussi di lavoro aziendali con esecuzione più lunga che dispongono di un componente di tempo esplicito, ad esempio timeout di 5 minuti per l'autenticazione a 2 fattori, timeout a lungo termine per gli utenti che confermano l'indirizzo di posta elettronica e componenti di più giorni, settimana o mese a lungo termine in domini come banche e assicurazioni.

Questi flussi di lavoro vengono spesso avviati dall'elaborazione di un messaggio, che quindi archivia uno stato e quindi pianifica un messaggio per continuare il processo in un secondo momento. I framework come NServiceBus e MassTransit semplificano l'integrazione di tutti questi elementi insieme.

Passaggi successivi

Per altre informazioni sulla messaggistica del bus di servizio, vedere gli argomenti seguenti:

Risorse aggiuntive