Timestamp e sequenze di messaggi
I timestamp e le sequenze sono due funzionalità sempre abilitate in tutte le entità del Bus di servizio e disponibili tramite le proprietà SequenceNumber
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 vengono spostati su zero quando l'intervallo di 64 bit o 48 bit (escluso 16 bit per l'identificatore di partizione) viene esaurito.
Il numero di sequenza può essere considerato attendibile come identificatore univoco perché viene 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 Sessioni di messaggistica del Bus di servizio.
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 si materializzano 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 proprietà
ScheduledEnqueueTimeUtc
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, viene aggiunto alla coda come se fosse stato accodato nell'istante corrente e gli viene quindi assegnato un nuovo SequenceNumber
.
Poiché la funzionalità è associata ai singoli messaggi e i messaggi possono essere accodati una sola volta, il Bus di servizio non supporta le 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.
- 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 a 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 e-mail e componenti a più giorni, settimana o mese lungo nei domini come banche e assicurazioni.
Questi flussi di lavoro vengono spesso avviati dall'elaborazione di un messaggio, che quindi archivia uno stato 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.
Contenuto correlato
Per altre informazioni sulla messaggistica del bus di servizio, vedere gli argomenti seguenti: