Code e argomenti partizionatiPartitioned queues and topics

Il bus di servizio di Azure usa più broker messaggi per elaborare i messaggi e più archivi di messaggistica per archiviarli.Azure Service Bus employs multiple message brokers to process messages and multiple messaging stores to store messages. Una coda o un argomento convenzionale è gestito da un singolo broker messaggi e archiviato in un archivio di messaggistica.A conventional queue or topic is handled by a single message broker and stored in one messaging store. 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.Service Bus partitions enable queues and topics, or messaging entities, to be partitioned across multiple message brokers and messaging stores. 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.Partitioning means that the overall throughput of a partitioned entity is no longer limited by the performance of a single message broker or messaging store. Inoltre, un'interruzione temporanea dell'alimentazione di un archivio di messaggistica non determina la mancanza di disponibilità di una coda o di un argomento partizionato.In addition, a temporary outage of a messaging store does not render a partitioned queue or topic unavailable. 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.Partitioned queues and topics can contain all advanced Service Bus features, such as support for transactions and sessions.

Nota

Il partizionamento è disponibile alla creazione dell'entità per tutte le code e gli argomenti in SKU di base o standard.Partitioning is available at entity creation for all queues and topics in Basic or Standard SKUs. Non è disponibile per lo SKU di messaggistica Premium, ma tutte le entità partizionate esistenti negli spazi dei nomi Premium continueranno a funzionare come previsto.It is not available for the Premium messaging SKU, but any previously existing partitioned entities in Premium namespaces continue to work as expected.

Non è possibile modificare l'opzione di partizionamento su una coda o un argomento esistente. L'opzione può essere impostata solo in fase di creazione dell'entità.It is not possible to change the partitioning option on any existing queue or topic; you can only set the option when you create the entity.

FunzionamentoHow it works

Ogni coda o argomento partizionato è costituito da più partizioni.Each partitioned queue or topic consists of multiple partitions. Ogni partizione viene archiviato in un archivio di messaggistica differente e gestito da un broker di messaggi diversi.Each partition is stored in a different messaging store and handled by a different message broker. Quando viene inviato un messaggio a una coda o argomento partizionato, il Bus di servizio assegna il messaggio a una delle partizioni.When a message is sent to a partitioned queue or topic, Service Bus assigns the message to one of the partitions. La selezione viene eseguita in modo casuale dal bus di servizio o tramite una chiave di partizione che può essere specificata dal mittente.The selection is done randomly by Service Bus or by using a partition key that the sender can specify.

Quando un client desidera ricevere un messaggio da una coda partizionata o da una sottoscrizione a un argomento partizionato, il Bus di servizio esegue query tutte le partizioni per i messaggi, quindi restituisce il primo messaggio ottenuto dagli archivi di messaggistica al destinatario.When a client wants to receive a message from a partitioned queue, or from a subscription to a partitioned topic, Service Bus queries all partitions for messages, then returns the first message that is obtained from any of the messaging stores to the receiver. Il bus di servizio memorizza nella cache gli altri messaggi e li restituisce quando riceve altre richieste.Service Bus caches the other messages and returns them when it receives additional receive requests. Un client destinatario non è a conoscenza del partizionamento; il comportamento verso il client di una coda o un argomento partizionato (ad esempio lettura, completamento, rinvio, non recapitabilità, prelettura) è identico a quello di un'entità normale.A receiving client is not aware of the partitioning; the client-facing behavior of a partitioned queue or topic (for example, read, complete, defer, deadletter, prefetching) is identical to the behavior of a regular entity.

I messaggi a una coda o a un argomento partizionato non presentano costi aggiuntivi, né in invio né in ricezione.There is no additional cost when sending a message to, or receiving a message from, a partitioned queue or topic.

Abilitare il partizionamentoEnable partitioning

Per usare le code e gli argomenti partizionati con il bus di servizio di Azure, usare Azure SDK 2.2 o versione successiva oppure specificare api-version=2013-10 o una versione successiva nelle richieste HTTP.To use partitioned queues and topics with Azure Service Bus, use the Azure SDK version 2.2 or later, or specify api-version=2013-10 or later in your HTTP requests.

StandardStandard

A livello di messaggistica Standard è possibile creare code e argomenti del bus di servizio in dimensioni di 1, 2, 3, 4 o 5 GB (il valore predefinito è 1 GB).In the Standard messaging tier, you can create Service Bus queues and topics in 1, 2, 3, 4, or 5-GB sizes (the default is 1 GB). Con il partizionamento abilitato, il Bus di servizio crea 16 copie (16 partizioni) dell'entità, ognuna delle stesse dimensioni specificata.With partitioning enabled, Service Bus creates 16 copies (16 partitions) of the entity, each of the same size specified. Di conseguenza, se si crea una coda con dimensioni pari a 5 GB, con 16 partizioni le dimensioni massime della coda diventano di 80 GB (5 * 16).As such, if you create a queue that's 5 GB in size, with 16 partitions the maximum queue size becomes (5 * 16) = 80 GB. È possibile vedere le dimensioni massime della coda o dell'argomento partizionato esaminando la voce corrispondente nel portale di Azure, nel pannello Panoramica relativo all'entità.You can see the maximum size of your partitioned queue or topic by looking at its entry on the Azure portal, in the Overview blade for that entity.

PremiumPremium

In uno spazio dei nomi livello Premium, entità di partizionamento non sono supportate.In a Premium tier namespace, partitioning entities are not supported. È tuttavia possibile creare code e argomenti del bus di servizio in dimensioni di 1, 2, 3, 4, 5, 10, 20, 40 o 80 GB (il valore predefinito è 1 GB).However, you can still create Service Bus queues and topics in 1, 2, 3, 4, 5, 10, 20, 40, or 80-GB sizes (the default is 1 GB). È possibile vedere le dimensioni della coda o dell'argomento esaminando la voce corrispondente nel portale di Azure, nel pannello Panoramica relativo all'entità.You can see the size of your queue or topic by looking at its entry on the Azure portal, in the Overview blade for that entity.

Creare una tabella partizionataCreate a partitioned entity

Sono disponibili vari modi per creare una coda o un argomento partizionato.There are several ways to create a partitioned queue or topic. Quando si crea la coda o l'argomento dalla propria applicazione, è possibile abilitare il partizionamento per la coda o l'argomento impostando, rispettivamente, la proprietà QueueDescription.EnablePartitioning o TopicDescription.EnablePartitioning su true.When you create the queue or topic from your application, you can enable partitioning for the queue or topic by respectively setting the QueueDescription.EnablePartitioning or TopicDescription.EnablePartitioning property to true. Queste proprietà devono essere impostate al momento della creazione della coda o dell'argomento e sono disponibili solo nella versione precedente della libreria WindowsAzure.ServiceBus.These properties must be set at the time the queue or topic is created, and are available only in the older WindowsAzure.ServiceBus library. Come detto in precedenza, non è possibile modificare queste proprietà in una coda o in un argomento esistente.As stated previously, it is not possible to change these properties on an existing queue or topic. Ad esempio:For example:

// Create partitioned topic
NamespaceManager ns = NamespaceManager.CreateFromConnectionString(myConnectionString);
TopicDescription td = new TopicDescription(TopicName);
td.EnablePartitioning = true;
ns.CreateTopic(td);

È possibile, in alternativa, creare una coda o un argomento partizionato nel portale di Azure.Alternatively, you can create a partitioned queue or topic in the Azure portal. Quando si crea una coda o un argomento nel portale, l'opzione Abilita partizionamento nella finestra di dialogo Crea della coda o dell'argomento è selezionata per impostazione predefinita.When you create a queue or topic in the portal, the Enable partitioning option in the queue or topic Create dialog box is checked by default. L'opzione può essere disabilitata solo in un'entità di livello Standard. Nel livello Premium il partizionamento non è supportato e la casella di controllo è disattivata.You can only disable this option in a Standard tier entity; in the Premium tier partitioning is not supported, and the checkbox has no effect.

Uso delle chiavi di partizioneUse of partition keys

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.When a message is enqueued into a partitioned queue or topic, Service Bus checks for the presence of a partition key. Se ne trova una, seleziona la partizione in base a tale chiave.If it finds one, it selects the partition based on that key. Se non trova una chiave di partizione, seleziona la partizione in base a un algoritmo interno.If it does not find a partition key, it selects the partition based on an internal algorithm.

Uso di una chiave di partizioneUsing a partition key

Alcuni scenari, ad esempio le sessioni o le transazioni, richiedono i messaggi da archiviare in una partizione specifica.Some scenarios, such as sessions or transactions, require messages to be stored in a specific partition. Tutti questi scenari richiedono l'uso di una chiave di partizione.All these scenarios require the use of a partition key. Tutti i messaggi che usano la stessa chiave di partizione vengono assegnati alla stessa partizione.All messages that use the same partition key are assigned to the same partition. Se la partizione è temporaneamente non disponibile, il Bus di servizio restituisce un errore.If the partition is temporarily unavailable, Service Bus returns an error.

In base allo scenario vengono usate come chiave di partizione proprietà dei messaggi diverse:Depending on the scenario, different message properties are used as a partition key:

SessionId: Se per un messaggio è impostata la proprietà SessionId, il bus di servizio usa SessionID come chiave di partizione.SessionId: If a message has the SessionId property set, then Service Bus uses SessionID as the partition key. In questo modo, tutti i messaggi appartenenti alla stessa sessione vengono gestiti dallo stesso broker messaggi.This way, all messages that belong to the same session are handled by the same message broker. Le sessioni consentono al bus di servizio di garantire l'ordinamento dei messaggi così come la coerenza degli stati della sessione.Sessions enable Service Bus to guarantee message ordering as well as the consistency of session states.

PartitionKey: Se per un messaggio è impostata la proprietà PartitionKey, ma non la proprietà SessionId, il bus di servizio usa il valore della proprietà PartitionKey come chiave di partizione.PartitionKey: If a message has the PartitionKey property but not the SessionId property set, then Service Bus uses the PartitionKey property value as the partition key. Se per il messaggio sono impostate le proprietà SessionId e PartitionKey, queste devono avere un valore identico.If the message has both the SessionId and the PartitionKey properties set, both properties must be identical. Se la proprietà PartitionKey è impostata su un valore diverso rispetto a quello della proprietà SessionId, il bus di servizio restituisce un'eccezione di operazione non valida.If the PartitionKey property is set to a different value than the SessionId property, Service Bus returns an invalid operation exception. La proprietà PartitionKey deve essere usata se un mittente invia messaggi transazionali che non sono in grado di riconoscere le sessioni.The PartitionKey property should be used if a sender sends non-session aware transactional messages. La chiave di partizione assicura che tutti i messaggi inviati all'interno di una transazione vengano gestiti dallo stesso broker di messaggistica.The partition key ensures that all messages that are sent within a transaction are handled by the same messaging broker.

MessageId: Se per la coda o l'argomento la proprietà RequiresDuplicateDetection è impostata su true e le proprietà SessionId o PartitionKey non sono impostate, la proprietà MessageId verrà usata come chiave di partizione.MessageId: If the queue or topic has the RequiresDuplicateDetection property set to true and the SessionId or PartitionKey properties are not set, then the MessageId property value serves as the partition key. (Le librerie di Microsoft .NET e AMQP assegnano automaticamente un ID messaggio, se questo non viene assegnato dall'applicazione mittente) In questo caso tutte le copie dello stesso messaggio vengono gestite dallo stesso broker messaggi.(The Microsoft .NET and AMQP libraries automatically assign a message ID if the sending application does not.) In this case, all copies of the same message are handled by the same message broker. Questo ID consente al bus di servizio di rilevare ed eliminare i messaggi duplicati.This ID enables Service Bus to detect and eliminate duplicate messages. Se la proprietà RequiresDuplicateDetection non è impostata su true, il bus di servizio non considera la proprietà MessageId come chiave di partizione.If the RequiresDuplicateDetection property is not set to true, Service Bus does not consider the MessageId property as a partition key.

Senza l'uso di una chiave di partizioneNot using a partition key

In assenza di una chiave di partizione, del Bus di servizio distribuisce messaggi in modo round robin per tutte le partizioni della coda partizionata o dell'argomento.In the absence of a partition key, Service Bus distributes messages in a round-robin fashion to all the partitions of the partitioned queue or topic. Se la partizione selezionata non è disponibile, il Bus di servizio assegna il messaggio a una partizione diversa.If the chosen partition is not available, Service Bus assigns the message to a different partition. In questo modo, l'operazione di invio viene completata correttamente indipendentemente dalla disponibilità o meno di un archivio di messaggistica.This way, the send operation succeeds despite the temporary unavailability of a messaging store. Non si otterrà tuttavia l'ordinamento garantito fornito da una chiave di partizione.However, you will not achieve the guaranteed ordering that a partition key provides.

Per un'analisi più approfondita del compromesso tra disponibilità (nessuna chiave di partizione) e coerenza (uso di una chiave di partizione), vedere questo articolo.For a more in-depth discussion of the tradeoff between availability (no partition key) and consistency (using a partition key), see this article. Queste informazioni si applicano ugualmente alle entità del bus di servizio partizionate.This information applies equally to partitioned Service Bus entities.

Per concedere al Bus di servizio tempo sufficiente per accodare il messaggio in una partizione diversa, il OperationTimeout valore specificato dal client che invia il messaggio deve essere maggiore di 15 secondi.To give Service Bus enough time to enqueue the message into a different partition, the OperationTimeout value specified by the client that sends the message must be greater than 15 seconds. È consigliabile impostare la proprietà OperationTimeout sul valore predefinito di 60 secondi.It is recommended that you set the OperationTimeout property to the default value of 60 seconds.

Una chiave di partizione "associa" un messaggio a una partizione specifica.A partition key "pins" a message to a specific partition. Se l'archivio di messaggistica che contiene la partizione non è disponibile, il Bus di servizio restituisce un errore.If the messaging store that holds this partition is unavailable, Service Bus returns an error. In assenza di una chiave di partizione, del Bus di servizio può scegliere una partizione diversa e l'operazione ha esito positivo.In the absence of a partition key, Service Bus can choose a different partition and the operation succeeds. È quindi consigliabile non specificare una chiave di partizione, a meno che non sia necessario.Therefore, it is recommended that you do not supply a partition key unless it is required.

Argomenti avanzati: usare le transazioni con entità partizionateAdvanced topics: use transactions with partitioned entities

I messaggi inviati come parte di una transazione devono specificare una chiave di partizione.Messages that are sent as part of a transaction must specify a partition key. La chiave può essere uno dei seguenti valori: SessionId, PartitionKey o MessageId.The key can be one of the following properties: SessionId, PartitionKey, or MessageId. Tutti i messaggi che vengono inviati come parte della stessa transazione devono specificare la stessa chiave di partizione.All messages that are sent as part of the same transaction must specify the same partition key. 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.If you attempt to send a message without a partition key within a transaction, Service Bus returns an invalid operation exception. 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.If you attempt to send multiple messages within the same transaction that have different partition keys, Service Bus returns an invalid operation exception. Ad esempio:For example:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    Message msg = new Message("This is a message");
    msg.PartitionKey = "myPartitionKey";
    messageSender.SendAsync(msg); 
    ts.CompleteAsync();
}
committableTransaction.Commit();

Se le proprietà che servono come chiave di partizione sono impostate, il Bus di servizio aggiunge il messaggio a una partizione specifica.If any of the properties that serve as a partition key are set, Service Bus pins the message to a specific partition. Questo comportamento si verifica indipendentemente dall'uso di una transazione.This behavior occurs whether or not a transaction is used. È consigliabile non specificare una chiave di partizione, a meno che non sia necessario.It is recommended that you do not specify a partition key if it is not necessary.

Uso delle sessioni con entità partizionateUsing sessions with partitioned entities

Per inviare un messaggio transazionale a un argomento o una coda in grado di riconoscere la sessione, per il messaggio deve essere impostata la proprietà SessionId.To send a transactional message to a session-aware topic or queue, the message must have the SessionId property set. Se è specificata anche la proprietà PartitionKey, quest'ultima deve avere un valore identico a quello della proprietà SessionId.If the PartitionKey property is specified as well, it must be identical to the SessionId property. In caso contrario, il bus di servizio restituisce un'eccezione di operazione non valida.If they differ, Service Bus returns an invalid operation exception.

A differenza delle code o degli argomenti normali (non partizionati), non è possibile usare una singola transazione per inviare più messaggi a sessioni diverse.Unlike regular (non-partitioned) queues or topics, it is not possible to use a single transaction to send multiple messages to different sessions. Se è stato effettuato un tentativo, il bus di servizio restituirà un'eccezione di operazione non valida,If attempted, Service Bus returns an invalid operation exception. Ad esempio:For example:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    Message msg = new Message("This is a message");
    msg.SessionId = "mySession";
    messageSender.SendAsync(msg); 
    ts.CompleteAsync();
}
committableTransaction.Commit();

Inoltro automatico dei messaggi con entità partizionateAutomatic message forwarding with partitioned entities

Il bus di servizio supporta l'inoltro automatico dei messaggi da, a o tra entità partizionate.Service Bus supports automatic message forwarding from, to, or between partitioned entities. Per abilitare l'inoltro automatico dei messaggi, impostare la proprietà QueueDescription.ForwardTo nella coda o nella sottoscrizione di origine.To enable automatic message forwarding, set the QueueDescription.ForwardTo property on the source queue or subscription. Se il messaggio specifica una chiave di partizione (SessionId, PartitionKey o MessageId), questa viene usata per l'entità di destinazione.If the message specifies a partition key (SessionId, PartitionKey, or MessageId), that partition key is used for the destination entity.

Considerazioni e indicazioniConsiderations and guidelines

  • Funzionalità a coerenza elevata: Se un'entità Usa funzionalità quali sessioni, il rilevamento dei duplicati o controllo esplicito della chiave di partizionamento, le operazioni di messaggistica vengano sempre indirizzate alla partizione specifica.High consistency features: If an entity uses features such as sessions, duplicate detection, or explicit control of partitioning key, then the messaging operations are always routed to specific partition. Se una delle partizioni esperienza traffico elevato o nell'archivio sottostante non è integro, esito negativo di queste operazioni e la disponibilità risulta ridotto.If any of the partitions experience high traffic or the underlying store is unhealthy, those operations fail and availability is reduced. La coerenza è complessivamente molto più elevata rispetto alle entità non partizionate. I problemi si verificano solo per un sottoinsieme del traffico, invece che per tutto il traffico.Overall, the consistency is still much higher than non-partitioned entities; only a subset of traffic is experiencing issues, as opposed to all the traffic. Per altre informazioni, vedere la discussione relativa a disponibilità e coerenza.For more information, see this discussion of availability and consistency.
  • Gestione: Operazioni quali la creazione, aggiornamento ed eliminazione devono essere eseguite in tutte le partizioni dell'entità.Management: Operations such as Create, Update, and Delete must be performed on all the partitions of the entity. Se tutte le partizioni non sono integra, potrebbero verificarsi errori per queste operazioni.If any partition is unhealthy, it could result in failures for these operations. Per l'operazione Get, informazioni quali il numero di messaggi devono essere aggregate di tutte le partizioni.For the Get operation, information such as message counts must be aggregated from all partitions. Se tutte le partizioni non sono integra, lo stato di disponibilità di entità risulta limitato.If any partition is unhealthy, the entity availability status is reported as limited.
  • Scenari di messaggi a basso volume: Per questi scenari, in particolare se si usa il protocollo HTTP, potrebbe essere necessario eseguire più operazioni di ricezione per ottenere tutti i messaggi.Low volume message scenarios: For such scenarios, especially when using the HTTP protocol, you may have to perform multiple receive operations in order to obtain all the messages. Per le richieste di ricezione, il front-end esegue un'operazione di ricezione di tutte le partizioni e memorizza nella cache tutte le risposte ricevute.For receive requests, the front end performs a receive on all the partitions and caches all the responses received. Una richiesta di ricezione successiva sulla stessa connessione sarebbe avvantaggiata dalla memorizzazione nella cache e le latenze di ricezione saranno minori.A subsequent receive request on the same connection would benefit from this caching and receive latencies will be lower. Se tuttavia sono presenti più connessioni o si usa HTTP, ciò crea una nuova connessione per ogni richiesta.However, if you have multiple connections or use HTTP, that establishes a new connection for each request. Non è quindi possibile assicurare che la richiesta venga ricevuta sullo stesso nodo.As such, there is no guarantee that it would land on the same node. Se tutti i messaggi esistenti sono bloccati e memorizzati nella cache in un altro front-end, l'operazione di ricezione restituisce null.If all existing messages are locked and cached in another front end, the receive operation returns null. I messaggi raggiungeranno infine la scadenza e verranno ricevuti di nuovo.Messages eventually expire and you can receive them again. È consigliabile usare la connessione keep-alive HTTP.HTTP keep-alive is recommended.
  • Esaminare/visualizzare messaggi: Disponibile solo nella versione precedente della libreria WindowsAzure.ServiceBus.Browse/Peek messages: Available only in the older WindowsAzure.ServiceBus library. PeekBatch non restituisce sempre il numero di messaggi specificato nella proprietà MessageCount.PeekBatch does not always return the number of messages specified in the MessageCount property. a causa di due motivi comuni.There are two common reasons for this behavior. Il primo motivo consiste nel fatto che le dimensioni aggregate della raccolta di messaggi superano le dimensioni massime pari a 256 kB.One reason is that the aggregated size of the collection of messages exceeds the maximum size of 256 KB. L'altro motivo dipende dal fatto che, se la proprietà EnablePartitioning della coda o dell'argomento è impostata su true, è possibile che una partizione non includa una quantità di messaggi sufficiente per completare il numero di messaggi richiesto.Another reason is that if the queue or topic has the EnablePartitioning property set to true, a partition may not have enough messages to complete the requested number of messages. In genere, se un'applicazione vuole ricevere un numero specifico di messaggi, deve chiamare ripetutamente PeekBatch fino a ottenere tale numero di messaggi o fino a quando non siano più presenti messaggi di cui visualizzare l'anteprima.In general, if an application wants to receive a specific number of messages, it should call PeekBatch repeatedly until it gets that number of messages, or there are no more messages to peek. Per altre informazioni, inclusi esempi di codice, vedere la documentazione relativa all'API QueueClient.PeekBatch o SubscriptionClient.PeekBatch.For more information, including code samples, see the QueueClient.PeekBatch or SubscriptionClient.PeekBatch API documentation.

Funzionalità aggiunte di recenteLatest added features

Limiti delle entità partizionatePartitioned entities limitations

Attualmente il bus di servizio impone alle code o agli argomenti partizionati i limiti seguenti:Currently Service Bus imposes the following limitations on partitioned queues and topics:

  • Code e argomenti partizionati non sono supportati nella messaggistica Premium.Partitioned queues and topics are not supported in the Premium messaging tier. Le sessioni sono supportate nel livello Premium mediante SessionId.Sessions are supported in the premier tier by using SessionId.
  • Le code e gli argomenti partizionati non supportano l'invio di messaggi che appartengono a sessioni diverse in una singola transazione.Partitioned queues and topics do not support sending messages that belong to different sessions in a single transaction.
  • Il bus di servizio attualmente consente fino a 100 code o argomenti partizionati per spazio dei nomi.Service Bus currently allows up to 100 partitioned queues or topics per namespace. Ogni coda o argomento partizionato viene conteggiato ai fini della quota di 10.000 entità per spazio dei nomi (non si applica al livello Premium).Each partitioned queue or topic counts towards the quota of 10,000 entities per namespace (does not apply to Premium tier).

Passaggi successiviNext steps

Per altre informazioni sui concetti di base relativi alle specifiche di messaggistica di AMQP 1.0 consultare la guida al protocollo AMQP 1.0.Read about the core concepts of the AMQP 1.0 messaging specification in the AMQP 1.0 protocol guide.