Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il bus di servizio di Azure usa più broker di messaggi per elaborare i messaggi e più archivi di messaggistica per archiviare i messaggi. Una coda o un argomento convenzionale è gestito da un singolo broker messaggi in un archivio di messaggistica. Le partizioni del bus di servizio consentono il partizionamento di code e argomenti, o entità di messaggistica, tra più broker messaggi e archivi di messaggistica. Il partizionamento indica che la velocità effettiva complessiva di un'entità partizionata non è più limitata dalle prestazioni di un singolo broker messaggi o archivio di messaggistica. Una interruzione temporanea di un archivio di messaggistica non influisce sulla disponibilità di code e argomenti partizionati. Le code e gli argomenti partizionati possono contenere tutte le funzionalità avanzate del bus di servizio, ad esempio il supporto delle transazioni e delle sessioni.
Nota
A livello di partizionamento, esistono alcune differenze tra SKU Basic/Standard e Premium.
- Il partizionamento è disponibile alla creazione dell'entità per tutte le code e gli argomenti in SKU di base o standard. Uno spazio dei nomi può disporre di entità partizionate e non partizionate.
- Il partizionamento è disponibile in fase di creazione dello spazio dei nomi per lo SKU Premium di messaggistica e tutte le code e gli argomenti in tale spazio dei nomi sono partizionati. Tutte le entità partizionate precedentemente migrate negli spazi dei nomi Premium continuano a funzionare come previsto.
- Quando si abilita il partizionamento negli SKU Basic o Standard, si creano sempre 16 partizioni.
- Quando si abilita il partizionamento nello SKU Premium, si specifica il numero di partizioni durante la creazione dello spazio dei nomi.
Non è possibile modificare l'opzione di partizionamento in qualsiasi spazio dei nomi, coda o argomento esistente. È possibile impostare l'opzione solo quando si crea l'entità.
Funzionamento
Ogni coda o argomento partizionato è costituito da più partizioni. Ogni partizione viene memorizzata in un archivio di messaggistica differente e gestito da un broker messaggi diverso. Quando un messaggio viene inviato a una coda o a un argomento partizionato, il bus di servizio assegna il messaggio a una delle partizioni. Il bus di servizio seleziona la partizione in modo casuale o usa una chiave di partizione specificata dal mittente.
Quando un client vuole ricevere un messaggio da una coda partizionata o da una sottoscrizione a un argomento partizionato, il bus di servizio esegue una query su tutte le partizioni per cercare i messaggi. Restituisce il primo messaggio ottenuto da uno qualsiasi degli archivi di messaggistica al ricevitore. Il bus di servizio memorizza nella cache gli altri messaggi e li restituisce quando riceve altre richieste. Un client ricevente non è a conoscenza del partizionamento. Il comportamento client di una coda o di un argomento partizionato (ad esempio, lettura, completamento, rinvio, deadletter, prelettura) è identico al comportamento di un'entità regolare.
L'operazione di visualizzazione in anteprima su un'entità non partizionata restituisce sempre il messaggio meno recente, ma non su un'entità partizionata. Restituisce invece il messaggio meno recente in una delle partizioni, il cui broker dei messaggi ha risposto per primo. Non esiste alcuna garanzia che il messaggio restituito sia il più vecchio tra tutte le partizioni.
I messaggi a una coda o a un argomento partizionato non presentano costi aggiuntivi, né in invio né in ricezione.
Nota
L'operazione di visualizzazione in anteprima restituisce il messaggio meno recente della partizione in base al numero di sequenza. Per le entità partizionate, il numero di sequenza è relativo alla partizione. Per altre informazioni, vedere Sequenziazione dei messaggi e timestamp.
Uso delle chiavi di partizione
Quando un messaggio viene accodato in una coda o in un argomento partizionato, il bus di servizio controlla la presenza di una chiave di partizione. Se ne trova una, seleziona la partizione in base a tale chiave. Se invece non trova alcuna chiave di partizione, seleziona la partizione in base a un algoritmo interno.
Uso di una chiave di partizione
In alcuni scenari, ad esempio le sessioni o le transazioni, i messaggi devono essere archiviati in una partizione specifica. Tutti questi scenari richiedono l'uso di una chiave di partizione. Il bus di servizio assegna tutti i messaggi che usano la stessa chiave di partizione alla stessa partizione. Se la partizione è temporaneamente non disponibile, il bus di servizio restituisce un errore.
In base allo scenario vengono usate come chiave di partizione proprietà dei messaggi diverse:
SessionId: se un messaggio ha impostato la proprietà ID sessione, il bus di servizio lo usa come chiave di partizione. In questo modo, lo stesso broker di messaggi gestisce tutti i messaggi che appartengono alla stessa sessione. Usando sessioni, il bus di servizio garantisce l'ordinamento dei messaggi e la coerenza degli stati della sessione.
PartitionKey: se un messaggio ha la proprietà della chiave di partizione ma non il set di proprietà id sessione, il bus di servizio usa il valore della proprietà della chiave di partizione come chiave di partizione. Se per il messaggio sono impostate entrambe le proprietà ID sessione e Chiave di partizione, queste devono avere un valore identico. Se la proprietà Chiave di partizione è impostata su un valore diverso rispetto a quello della proprietà ID sessione, il bus di servizio restituisce un'eccezione di operazione non valida. Utilizzare la proprietà della chiave di partizione se un mittente invia messaggi transazionali non sensibili alla sessione. La chiave di partizione garantisce che lo stesso broker di messaggistica gestisca tutti i messaggi inviati all'interno di una transazione.
MessageId: se si crea la coda o l'argomento con la funzionalità di rilevamento duplicati e non si impostano le proprietà dell'ID sessione o della chiave di partizione, il valore della proprietà ID messaggio funge da chiave di partizione. Le librerie client Microsoft assegnano automaticamente un ID messaggio se l'applicazione di invio non lo fa. In questo caso, lo stesso broker di messaggi gestisce tutte le copie dello stesso messaggio. Questo ID consente al bus di servizio di rilevare ed eliminare i messaggi duplicati. Se la funzionalità di rilevamento duplicati non è abilitata, il bus di servizio non considera la proprietà ID messaggio come chiave di partizione.
Senza l'uso di una chiave di partizione
Se non si specifica una chiave di partizione, il bus di servizio distribuisce i messaggi in modo round robin a tutte le partizioni della coda o dell'argomento partizionato. Se la partizione scelta non è disponibile, il bus di servizio assegna il messaggio a un’altra partizione. In questo modo, l'operazione di invio viene completata correttamente indipendentemente dalla disponibilità o meno di un archivio di messaggistica. Tuttavia, non si ottiene l'ordinamento garantito fornito da una chiave di partizione.
Per un'analisi più approfondita del compromesso tra disponibilità (nessuna chiave di partizione) e coerenza (uso di una chiave di partizione), vedere Disponibilità e coerenza nell'Hub eventi. Ad eccezione dell'ID partizione non esposto agli utenti, queste informazioni si applicano ugualmente alle entità del bus di servizio partizionate.
Per concedere al bus di servizio tempo sufficiente per l'accodamento del messaggio in una partizione diversa, il valore di timeout specificato dal client che invia il messaggio deve essere maggiore di 15 secondi. È consigliabile usare il valore predefinito di 60 secondi.
Una chiave di partizione "aggiunge" un messaggio a una partizione specifica. Se l'archivio di messaggistica che contiene questa partizione non è disponibile, Service Bus restituisce un errore. In assenza di una chiave di partizione, il bus di servizio può scegliere una partizione diversa e l'operazione verrà completata correttamente. Pertanto, non fornire una chiave di partizione a meno che non sia necessaria.
Argomenti avanzati
Usare transazioni con entità partizionate
I messaggi inviati come parte di una transazione devono specificare una chiave di partizione. La chiave può essere una delle proprietà seguenti: ID sessione, chiave di partizione o ID messaggio. Tutti i messaggi inviati come parte della stessa transazione devono specificare la stessa chiave di partizione. Se si prova a inviare un messaggio senza una chiave di partizione in una transazione, il bus di servizio restituisce un'eccezione di operazione non valida. Se si prova a inviare più messaggi con chiavi di partizione diverse nella stessa transazione, il bus di servizio restituisce un'eccezione di operazione non valida. Ad esempio:
CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
ServiceBusMessage msg = new ServiceBusMessage("This is a message");
msg.PartitionKey = "myPartitionKey";
await sender.SendMessageAsync(msg);
ts.Complete();
}
committableTransaction.Commit();
Se si imposta una delle proprietà che fungono da chiave di partizione, il bus di servizio aggiunge il messaggio a una partizione specifica. Questo comportamento si verifica se si usa o meno una transazione. Non specificare una chiave di partizione se non è necessaria.
Usare transazioni in sessioni con entità partizionate
Per inviare un messaggio transazionale a un argomento o una coda sensibili alla sessione, impostare la proprietà ID sessione nel messaggio. Se si specifica la proprietà della chiave di partizione, deve essere identica alla proprietà ID sessione. Se differiscono, Service Bus restituisce un'eccezione di operazione non valida.
A differenza delle code o degli argomenti normali (non partizionati), non è possibile usare una singola transazione per inviare più messaggi a sessioni diverse. Se si tenta di eseguire questa operazione, il bus di servizio restituisce un'eccezione di operazione non valida. Ad esempio:
CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
ServiceBusMessage msg = new ServiceBusMessage("This is a message");
msg.SessionId = "mySession";
await sender.SendMessageAsync(msg);
ts.Complete();
}
committableTransaction.Commit();
Inoltro automatico dei messaggi con entità partizionate
Il bus di servizio supporta l'inoltro automatico dei messaggi da, a o tra entità partizionate. È possibile abilitare questa funzione durante la creazione o l'aggiornamento di code e sottoscrizioni. Per altre informazioni, vedere Abilitare l'inoltro dei messaggi. Se il messaggio specifica una chiave di partizione (ID sessione, chiave di partizione o ID messaggio), tale chiave di partizione viene usata per l'entità di destinazione.
Considerazioni e indicazioni
- Funzionalità di coerenza elevata: se un'entità usa funzionalità come sessioni, rilevamento duplicati o controllo esplicito della chiave di partizionamento, le operazioni di messaggistica instradano sempre a una partizione specifica. In caso di traffico elevato in una delle partizioni o di stato non integro dell'archivio sottostante, queste operazioni hanno esito negativo e la disponibilità viene ridotta. In generale, la coerenza è ancora molto più elevata rispetto alle entità non partizionate. Solo un sottoinsieme del traffico sperimenta problemi, anziché tutto il traffico. Per altre informazioni, vedere la discussione relativa a disponibilità e coerenza.
- Gestione: le operazioni di creazione, aggiornamento ed eliminazione devono essere eseguite su tutte le partizioni dell'entità. Se una partizione è in uno stato non sano, potrebbero verificarsi errori per queste operazioni. Per l'operazione Get è necessario aggregare da tutte le partizioni le informazioni quali il numero di messaggi. Se una partizione è non sana, lo stato di disponibilità dell'entità risulta limitato.
- Scenari con volumi ridotti di messaggi: per questi scenari, in particolare se si usa il protocollo HTTP, potrebbe essere necessario eseguire più operazioni di ricezione per ottenere tutti i messaggi. Per le richieste di ricezione, il front-end esegue una ricezione in tutte le partizioni e memorizza nella cache tutte le risposte ricevute. Una richiesta di ricezione successiva sulla stessa connessione beneficia di questa memorizzazione nella cache e le latenze di ricezione sono inferiori. Se tuttavia sono presenti più connessioni o si usa HTTP, viene stabilita una nuova connessione per ogni richiesta. Di conseguenza, non c'è alcuna garanzia che venga inserita nello stesso nodo. Se tutti i messaggi esistenti sono bloccati e memorizzati nella cache in un altro front-end, l'operazione di ricezione restituisce null. I messaggi raggiungeranno infine la scadenza e verranno ricevuti di nuovo. È consigliato il keep-alive HTTP. Quando si usa il partizionamento in scenari a basso volume, le operazioni di ricezione potrebbero richiedere più tempo del previsto. Di conseguenza, non usare il partizionamento in questi scenari. Eliminare le entità partizionate esistenti e ricrearle con il partizionamento disabilitato per migliorare le prestazioni.
- Messaggi Sfoglia/Visualizza in anteprima: l'operazione di visualizzazione in anteprima non restituisce sempre il numero di messaggi richiesti. Due motivi comuni spiegano questo comportamento. Il primo motivo consiste nel fatto che le dimensioni aggregate della raccolta di messaggi superano le dimensioni massime. Un altro motivo è che nelle code o negli argomenti partizionati una partizione potrebbe non avere messaggi sufficienti per restituire il numero richiesto di messaggi. In generale, se un'applicazione vuole visualizzare o esplorare un numero specifico di messaggi, deve chiamare ripetutamente l'operazione di visualizzazione finché non ottiene tale numero di messaggi o non ci sono altri messaggi da visualizzare. Per altre informazioni, inclusi gli esempi di codice, vedere Esplorazione dei messaggi.
Limiti delle entità partizionate
Attualmente il bus di servizio impone alle code o agli argomenti partizionati i limiti seguenti:
- Le code e gli argomenti partizionati non supportano l'invio di messaggi che appartengono a sessioni diverse in una singola transazione.
- Il bus di servizio attualmente consente fino a 100 code o argomenti partizionati per spazio dei nomi per i livelli Basic e Standard. Ogni coda o argomento partizionato viene conteggiato ai fini della quota di 10.000 entità per spazio dei nomi.
Passaggi successivi
È possibile abilitare il partizionamento usando il portale di Azure, PowerShell, l'interfaccia della riga di comando, il modello di Resource Manager, .NET, Java, Python e JavaScript. Per altre informazioni, vedere Abilitare il partizionamento (Basic/Standard).
Per informazioni sui concetti di base della specifica di messaggistica Advanced Message Queuing Protocol (AMQP) 1.0, vedere la guida al protocollo AMQP 1.0.