Code e argomenti partizionati

Il bus di servizio di Azure usa più broker messaggi per elaborare i messaggi e più archivi di messaggistica per archiviarli. Una coda o un argomento convenzionale è gestito da un singolo broker messaggi e archiviato 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. Inoltre, un'interruzione temporanea di un archivio di messaggistica non esegue il rendering di una coda o di un argomento partizionato non disponibile. 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

Esistono alcune differenze tra lo SKU Basic/Standard e Premium quando si tratta di partizionamento.

  • 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ò avere entità partizionate e non partizionate.
  • Il partizionamento è disponibile in fase di creazione dello spazio dei nomi per lo SKU di messaggistica Premium e tutte le code e gli argomenti in tale spazio dei nomi verranno partizionati. Tutte le entità partizionate precedentemente migrate negli spazi dei nomi Premium continueranno a funzionare come previsto.
  • Quando il partizionamento è abilitato negli SKU Basic o Standard, verranno sempre create 16 partizioni.
  • Quando il partizionamento è abilitato nello SKU Premium, la quantità di partizioni viene specificata 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 archiviata in un archivio di messaggistica diverso e gestita da un broker di messaggi diverso. Quando un messaggio viene inviato a una coda o a un argomento partizionato, bus di servizio assegna il messaggio a una delle partizioni. La selezione viene eseguita in modo casuale dal bus di servizio o tramite una chiave di partizione che può essere specificata dal mittente.

Quando un client desidera ricevere un messaggio da una coda partizionata o da una sottoscrizione a un argomento partizionato, bus di servizio esegue una query su tutte le partizioni per i messaggi, quindi restituisce il primo messaggio ottenuto da uno degli archivi di messaggistica al ricevitore. bus di servizio memorizza nella cache gli altri messaggi e li restituisce quando riceve più richieste di ricezione. Un client ricevente non è a conoscenza del partizionamento; Il comportamento rivolto al 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 su un'entità non partizionata restituisce sempre il messaggio meno recente, ma non in un'entità partizionata. Restituisce invece il messaggio meno recente in una delle partizioni il cui broker messaggi ha risposto per primo. Non esiste alcuna garanzia che il messaggio restituito sia quello meno recente in tutte le partizioni.

Non sono previsti costi aggiuntivi per l'invio di un messaggio o la ricezione di un messaggio da una coda o un argomento partizionato.

Nota

L'operazione di visualizzazione restituisce il messaggio meno recente della partizione in base al numero di sequenza. Per le entità partizionate, il numero di sequenza viene emesso in relazione alla partizione. Per altre informazioni, vedere Sequenziazione e timestamp dei messaggi.

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 uno, seleziona la partizione in base a tale chiave. Se non trova una chiave di partizione, seleziona la partizione in base a un algoritmo interno.

Uso di una chiave di partizione

Alcuni scenari, ad esempio sessioni o transazioni, richiedono che i messaggi vengano archiviati in una partizione specifica. Tutti questi scenari richiedono l'uso di una chiave di partizione. Tutti i messaggi che usano la stessa chiave di partizione vengono assegnati alla stessa partizione. Se la partizione non è temporaneamente disponibile, 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, bus di servizio lo usa come chiave di partizione. In questo modo, tutti i messaggi appartenenti alla stessa sessione vengono gestiti dallo stesso broker messaggi. Le sessioni consentono al bus di servizio di garantire l'ordinamento dei messaggi così come 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, bus di servizio usa il valore della proprietà della chiave di partizione come chiave di partizione. Se il messaggio ha sia l'ID sessione che le proprietà della chiave di partizione impostate, entrambe le proprietà devono essere identiche. Se la proprietà della chiave di partizione è impostata su un valore diverso rispetto alla proprietà ID sessione, bus di servizio restituisce un'eccezione di operazione non valida. La proprietà della chiave di partizione deve essere utilizzata se un mittente invia messaggi transazionali non sensibili alla sessione. La chiave di partizione assicura che tutti i messaggi inviati all'interno di una transazione vengano gestiti dallo stesso broker di messaggistica.

MessageId: se la coda o l'argomento è stato creato con la funzionalità di rilevamento duplicati e le proprietà dell'ID sessione o della chiave di partizione non sono impostate, il valore della proprietà DELL'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, tutte le copie dello stesso messaggio vengono gestite dallo stesso broker di messaggi. Questo ID consente al bus di servizio di rilevare ed eliminare i messaggi duplicati. Se la funzionalità di rilevamento duplicati non è abilitata, bus di servizio non considera la proprietà ID messaggio come chiave di partizione.

Senza l'uso di una chiave di partizione

In assenza di una chiave di partizione, 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, bus di servizio assegna il messaggio a una partizione diversa. In questo modo, l'operazione di invio viene completata correttamente indipendentemente dalla disponibilità o meno di un archivio di messaggistica. Tuttavia, non si otterrà l'ordinamento garantito fornito da una chiave di partizione.

Per una descrizione più approfondita del compromesso tra disponibilità (nessuna chiave di partizione) e coerenza (usando una chiave di partizione), vedere Disponibilità e coerenza in Hub eventi. Ad eccezione dell'ID partizione non esposto agli utenti, queste informazioni si applicano allo stesso modo alle entità partizionate bus di servizio.

Per concedere bus di servizio tempo sufficiente per accodare il 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, bus di servizio restituisce un errore. In assenza di una chiave di partizione, bus di servizio possibile scegliere una partizione diversa e l'operazione ha esito positivo. È quindi consigliabile non specificare 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 che vengono 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 viene impostata una delle proprietà che fungono da chiave di partizione, bus di servizio aggiunge il messaggio a una partizione specifica. Questo comportamento si verifica indipendentemente dall'uso di una transazione. Se non è necessario, è consigliabile non specificare una chiave di partizione.

Usare le transazioni nelle sessioni con entità partizionate

Per inviare un messaggio transazionale a un argomento o a una coda compatibile con la sessione, il messaggio deve avere la proprietà ID sessione impostata. Se viene specificata anche la proprietà della chiave di partizione, deve essere identica alla proprietà ID sessione. In caso contrario, il bus di servizio 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 è stato effettuato un tentativo, il bus di servizio restituirà 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 funzionalità 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 vengono sempre instradate a una partizione specifica. Se una delle partizioni riscontra un traffico elevato o l'archivio sottostante non è integra, tali operazioni hanno esito negativo e la disponibilità viene ridotta. Nel complesso, la coerenza è ancora molto più elevata rispetto alle entità non partizionate; solo un subset di traffico riscontra problemi, anziché tutto il traffico. Per altre informazioni, vedere la discussione relativa a disponibilità e coerenza.
  • Gestione: le operazioni come Create, Update ed Delete devono essere eseguite in tutte le partizioni dell'entità. Se una partizione non è integra, potrebbe verificarsi errori per queste operazioni. Per l'operazione Get, le informazioni come i conteggi dei messaggi devono essere aggregate da tutte le partizioni. Se una partizione non è integra, lo stato di disponibilità dell'entità viene segnalato come limitato.
  • Scenari di messaggi con volume ridotto: per questi scenari, in particolare quando 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 potrebbe trarre vantaggio da questa memorizzazione nella cache e ricevere latenze sono inferiori. Tuttavia, se si dispone di più connessioni o si usa HTTP, viene stabilita una nuova connessione per ogni richiesta. Di conseguenza, non esiste alcuna garanzia che si troverebbe 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. È consigliabile usare la connessione 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, è consigliabile non usare il partizionamento in questi scenari. Eliminare le entità partizionate esistenti e ricrearle con il partizionamento disabilitato per migliorare le prestazioni.
  • Sfoglia/Visualizza messaggi: l'operazione di visualizzazione non restituisce sempre il numero di messaggi richiesti. a causa di due motivi comuni. Una ragione è che la dimensione aggregata della raccolta di messaggi supera 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/esplorare un numero specifico di messaggi, deve chiamare ripetutamente l'operazione di visualizzazione finché non ottiene tale numero di messaggi o non sono presenti 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:

  • Per gli spazi dei nomi Premium partizionati, la dimensione del messaggio è limitata a 1 MB quando i messaggi vengono inviati singolarmente e le dimensioni del batch sono limitate a 1 MB quando i messaggi vengono inviati in un batch.
  • Le code e gli argomenti partizionati non supportano l'invio di messaggi appartenenti a sessioni diverse in una singola transazione.
  • bus di servizio attualmente consente fino a 100 code o argomenti partizionati per spazio dei nomi per lo SKU 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 portale di Azure, PowerShell, interfaccia della riga di comando, modello di Resource Manager, .NET, Java, Python e JavaScript. Per altre informazioni, vedere Abilitare il partizionamento (Basic/Standard).For more information, see Enable partitioning (Basic/Standard).

Leggere i concetti di base della specifica di messaggistica AMQP (Advanced Message Queueing Protocol) 1.0 nella guida al protocollo AMQP 1.0.