Procedure consigliate per il miglioramento delle prestazioni tramite la messaggistica del bus di servizioBest Practices for performance improvements using Service Bus Messaging

Questo articolo descrive come usare il bus di servizio di Azure per ottimizzare le prestazioni durante lo scambio di messaggi negoziati.This article describes how to use Azure Service Bus to optimize performance when exchanging brokered messages. La prima parte dell'articolo descrive i diversi meccanismi disponibili per migliorare le prestazioni.The first part of this article describes the different mechanisms that are offered to help increase performance. La seconda parte fornisce invece indicazioni su come usare il bus di servizio per garantire le prestazioni ottimali in uno scenario specifico.The second part provides guidance on how to use Service Bus in a way that can offer the best performance in a given scenario.

In questo argomento il termine "client" fa riferimento a qualsiasi entità che accede al bus di servizio.Throughout this topic, the term "client" refers to any entity that accesses Service Bus. Un client può assumere il ruolo di mittente o di ricevitore.A client can take the role of a sender or a receiver. Il termine "mittente" viene usato per un client di coda o argomento del bus di servizio che invia messaggi a una sottoscrizione di una coda o un argomento del bus di servizio.The term "sender" is used for a Service Bus queue or topic client that sends messages to a Service Bus queue or topic subscription. Il termine "ricevitore" fa riferimento a un client di coda o sottoscrizione del bus di servizio che riceve messaggi da una coda o da una sottoscrizione del bus di servizio.The term "receiver" refers to a Service Bus queue or subscription client that receives messages from a Service Bus queue or subscription.

Queste sezioni presentano numerosi concetti usati dal bus di servizio per migliorare le prestazioni.These sections introduce several concepts that Service Bus uses to help boost performance.

ProtocolliProtocols

Il bus di servizio consente ai client di inviare e ricevere messaggi tramite uno dei tre protocolli:Service Bus enables clients to send and receive messages via one of three protocols:

  1. Advanced Message Queuing Protocol (AMQP)Advanced Message Queuing Protocol (AMQP)
  2. Service Bus Messaging Protocol (SBMP)Service Bus Messaging Protocol (SBMP)
  3. httpHTTP

AMQP e SBMP sono più efficienti, poiché mantengono la connessione al bus di servizio finché la factory di messaggistica esista.AMQP and SBMP are more efficient, because they maintain the connection to Service Bus as long as the messaging factory exists. Implementa anche le operazioni di invio in batch e prelettura.It also implements batching and prefetching. Se non è indicato in modo esplicito, tutti i contenuti di questo argomento presuppongono l'uso di AMQP o SBMP.Unless explicitly mentioned, all content in this topic assumes the use of AMQP or SBMP.

Riutilizzo di factory e clientReusing factories and clients

Gli oggetti client del bus di servizio, ad esempio QueueClient o MessageSender, vengono creati tramite un oggetto MessagingFactory che offre anche la gestione interna delle connessioni.Service Bus client objects, such as QueueClient or MessageSender, are created through a MessagingFactory object, which also provides internal management of connections. È consigliabile non chiudere le factory di messaggistica o i client di coda, argomento e sottoscrizione dopo aver inviato un messaggio e crearli di nuovo per l'invio del messaggio successivo.You should not close messaging factories or queue, topic, and subscription clients after you send a message, and then re-create them when you send the next message. Quando si chiude una factory di messaggistica viene eliminata la connessione al servizio Bus di servizio e viene stabilita una nuova connessione quando si crea di nuovo la factory.Closing a messaging factory deletes the connection to the Service Bus service, and a new connection is established when recreating the factory. Stabilire una nuova connessione è un'operazione costosa che si può evitare riutilizzando la stessa factory e gli stessi oggetti client per più operazioni.Establishing a connection is an expensive operation that you can avoid by re-using the same factory and client objects for multiple operations. È possibile usare l'oggetto QueueClient per inviare messaggi da più thread e operazioni asincrone simultanee.You can safely use the QueueClient object for sending messages from concurrent asynchronous operations and multiple threads.

Operazioni simultaneeConcurrent operations

L'esecuzione di un'operazione (invio, ricezione, eliminazione e così via) richiede tempo.Performing an operation (send, receive, delete, etc.) takes some time. Questa volta include l'elaborazione dell'operazione dal servizio Bus di servizio oltre alla latenza della richiesta e risposta.This time includes the processing of the operation by the Service Bus service in addition to the latency of the request and the reply. Per aumentare il numero di operazioni per volta, è necessario eseguire le operazioni contemporaneamente.To increase the number of operations per time, operations must execute concurrently. È possibile farlo in diversi modi:You can do this in several different ways:

  • Operazioni asincrone: il client pianifica le operazioni eseguendo operazioni asincrone.Asynchronous operations: the client schedules operations by performing asynchronous operations. La richiesta successiva viene avviata prima del completamento della richiesta precedente.The next request is started before the previous request is completed. Ecco un esempio di operazione di invio in modalità asincrona:The following is an example of an asynchronous send operation:

    BrokeredMessage m1 = new BrokeredMessage(body);
    BrokeredMessage m2 = new BrokeredMessage(body);
    
    Task send1 = queueClient.SendAsync(m1).ContinueWith((t) => 
      {
        Console.WriteLine("Sent message #1");
      });
    Task send2 = queueClient.SendAsync(m2).ContinueWith((t) => 
      {
        Console.WriteLine("Sent message #2");
      });
    Task.WaitAll(send1, send2);
    Console.WriteLine("All messages sent");
    

    Ecco un esempio di operazione di ricezione in modalità asincrona:This is an example of an asynchronous receive operation:

    Task receive1 = queueClient.ReceiveAsync().ContinueWith(ProcessReceivedMessage);
    Task receive2 = queueClient.ReceiveAsync().ContinueWith(ProcessReceivedMessage);
    
    Task.WaitAll(receive1, receive2);
    Console.WriteLine("All messages received");
    
    async void ProcessReceivedMessage(Task<BrokeredMessage> t)
    {
      BrokeredMessage m = t.Result;
      Console.WriteLine("{0} received", m.Label);
      await m.CompleteAsync();
      Console.WriteLine("{0} complete", m.Label);
    }
    
  • Più factory: tutti i client, mittenti e ricevitori, creati dalla stessa factory condividono la stessa connessione TCP.Multiple factories: all clients (senders in addition to receivers) that are created by the same factory share one TCP connection. La velocità effettiva massima dei messaggi è limitata dal numero di operazioni che possono usare questa connessione TCP.The maximum message throughput is limited by the number of operations that can go through this TCP connection. La velocità effettiva che si può ottenere con una singola factory varia in modo significativo a seconda dei tempi di round trip TCP e delle dimensioni dei messaggi.The throughput that can be obtained with a single factory varies greatly with TCP round-trip times and message size. Per ottenere una velocità effettiva più elevata, è consigliare usare più factory di messaggistica.To obtain higher throughput rates, you should use multiple messaging factories.

Modalità di ricezioneReceive mode

Quando si crea un client di coda o sottoscrizione, è possibile specificare una modalità di ricezione: PeekLock o ReceiveAndDelete.When creating a queue or subscription client, you can specify a receive mode: Peek-lock or Receive and Delete. La modalità di ricezione predefinita è PeekLock.The default receive mode is PeekLock. Quando si opera in questa modalità, il client invia una richiesta per la ricezione di un messaggio dal bus di servizio.When operating in this mode, the client sends a request to receive a message from Service Bus. Una volta che il client ha ricevuto il messaggio, invia una richiesta per il completamento del messaggio.After the client has received the message, it sends a request to complete the message.

Quando la modalità di ricezione è impostata su ReceiveAndDelete, entrambi i passaggi vengono combinati in una singola richiesta.When setting the receive mode to ReceiveAndDelete, both steps are combined in a single request. Questo permette di ridurre il numero complessivo di operazioni e di migliorare la velocità effettiva dei messaggi.This reduces the overall number of operations, and can improve the overall message throughput. Questo miglioramento delle prestazioni tuttavia comporta il rischio di perdere alcuni messaggi.This performance gain comes at the risk of losing messages.

Il bus di servizio non supporta le transazioni per le operazioni receive-and-delete.Service Bus does not support transactions for receive-and-delete operations. La semantica peek-lock (blocco di visualizzazione) è anche necessaria per qualsiasi scenario in cui il client vuole posticipare l'invio di un messaggio o inserirlo nella coda dei messaggi non recapitabili.In addition, peek-lock semantics are required for any scenarios in which the client wants to defer or dead-letter a message.

Invio in batch sul lato clientClient-side batching

L'invio in batch sul lato client consente a un client di coda o argomento di ritardare l'invio di un messaggio per un determinato periodo di tempo.Client-side batching enables a queue or topic client to delay the sending of a message for a certain period of time. Se il client invia messaggi aggiuntivi durante questo periodo di tempo, trasmette i messaggi in un singolo batch.If the client sends additional messages during this time period, it transmits the messages in a single batch. L'invio in batch sul lato client prevede anche che il client di coda o la sottoscrizione invii in batch più richieste di tipo Complete in una singola richiesta.Client-side batching also causes a queue or subscription client to batch multiple Complete requests into a single request. L'invio in batch è disponibile solo per le operazioni asincrone Send e Complete.Batching is only available for asynchronous Send and Complete operations. Le operazioni sincrone vengono immediatamente inviate al servizio Bus di servizio.Synchronous operations are immediately sent to the Service Bus service. L'invio in batch non si verifica per le operazioni di anteprima (peek) o ricezione né tra più client.Batching does not occur for peek or receive operations, nor does batching occur across clients.

Per impostazione predefinita, i client usano un intervallo di invio in batch di 20 ms.By default, a client uses a batch interval of 20ms. È possibile modificare l'intervallo di invio in batch impostando la proprietà BatchFlushInterval prima di creare la factory di messaggistica.You can change the batch interval by setting the BatchFlushInterval property before creating the messaging factory. Questa impostazione interessa tutti i client creati da questa factory.This setting affects all clients that are created by this factory.

Per disabilitare l'invio in batch, impostare la proprietà BatchFlushInterval su TimeSpan.Zero.To disable batching, set the BatchFlushInterval property to TimeSpan.Zero. Ad esempio:For example:

MessagingFactorySettings mfs = new MessagingFactorySettings();
mfs.TokenProvider = tokenProvider;
mfs.NetMessagingTransportSettings.BatchFlushInterval = TimeSpan.FromSeconds(0.05);
MessagingFactory messagingFactory = MessagingFactory.Create(namespaceUri, mfs);

L'invio in batch non influisce sul numero di operazioni di messaggistica fatturabili ed è disponibile solo per il protocollo client del bus di servizio.Batching does not affect the number of billable messaging operations, and is available only for the Service Bus client protocol. Il protocollo HTTP non supporta l'invio in batch.The HTTP protocol does not support batching.

Invio in batch per l'accesso all'archivioBatching store access

Per aumentare la velocità effettiva di una coda, un argomento o una sottoscrizione, il bus di servizio invia in batch più messaggi quando esegue la scrittura nel proprio archivio interno.To increase the throughput of a queue, topic, or subscription, Service Bus batches multiple messages when it writes to its internal store. Se abilitata in una coda o in un argomento, la scrittura di messaggi nell'archivio verrà eseguita in batch.If enabled on a queue or topic, writing messages into the store will be batched. Se abilitata in una coda o in una sottoscrizione, l'eliminazione di messaggi dall'archivio verrà eseguita in batch.If enabled on a queue or subscription, deleting messages from the store will be batched. Se l'accesso in batch all'archivio è abilitato per un'entità, il bus di servizio ritarda l'operazione di scrittura nell'archivio relativa all'entità per un massimo di 20 ms.If batched store access is enabled for an entity, Service Bus delays a store write operation regarding that entity by up to 20ms. Le operazioni di scrittura aggiuntive che si verificano durante questo intervallo vengono aggiunte al batch.Additional store operations that occur during this interval are added to the batch. L'accesso in batch all'archivio influisce solo sulle operazioni Send e Complete e non sulle operazioni di ricezione.Batched store access only affects Send and Complete operations; receive operations are not affected. L'accesso in batch all'archivio è una proprietà di un'entità.Batched store access is a property on an entity. L'invio in batch si verifica per tutte le entità per cui è abilitato l'accesso in batch all'archivio.Batching occurs across all entities that enable batched store access.

Quando si crea una nuova coda, un nuovo argomento o una nuova sottoscrizione, l'accesso in batch all'archivio è abilitato per impostazione predefinita.When creating a new queue, topic or subscription, batched store access is enabled by default. Per disabilitare l'accesso in batch all'archivio, impostare la proprietà EnableBatchedOperations su false prima di creare l'entità.To disable batched store access, set the EnableBatchedOperations property to false before creating the entity. Ad esempio:For example:

QueueDescription qd = new QueueDescription();
qd.EnableBatchedOperations = false;
Queue q = namespaceManager.CreateQueue(qd);

L'accesso in batch all'archivio non influisce sul numero di operazioni di messaggistica fatturabili ed è una proprietà di una coda, di un argomento o di una sottoscrizione.Batched store access does not affect the number of billable messaging operations, and is a property of a queue, topic, or subscription. È indipendente dalla modalità di ricezione e dal protocollo usato tra un client e il servizio Bus di servizio.It is independent of the receive mode and the protocol that is used between a client and the Service Bus service.

PreletturaPrefetching

La prelettura consente al client di coda o sottoscrizione di caricare messaggi aggiuntivi dal servizio durante l'esecuzione di un'operazione di ricezione.Prefetching enables the queue or subscription client to load additional messages from the service when it performs a receive operation. Il client archivia i messaggi in una cache locale.The client stores these messages in a local cache. Le dimensioni della cache sono determinate dalle proprietà QueueClient.PrefetchCount o SubscriptionClient.PrefetchCount.The size of the cache is determined by the QueueClient.PrefetchCount or SubscriptionClient.PrefetchCount properties. Ogni client che abilita la prelettura mantiene la propria cache.Each client that enables prefetching maintains its own cache. La cache non è condivisa tra i client.A cache is not shared across clients. Se il client avvia un'operazione di ricezione e la relativa cache è vuota, il servizio trasmette un batch di messaggi.If the client initiates a receive operation and its cache is empty, the service transmits a batch of messages. Le dimensioni del batch corrispondono alle dimensioni della cache o a 256 KB, a seconda del valore minore.The size of the batch equals the size of the cache or 256 KB, whichever is smaller. Se il client avvia un'operazione di ricezione e la cache contiene un messaggio, il messaggio viene recuperato dalla cache.If the client initiates a receive operation and the cache contains a message, the message is taken from the cache.

Quando un messaggio viene sottoposto a prelettura, il servizio lo blocca.When a message is prefetched, the service locks the prefetched message. In questo modo, il messaggio non potrà essere ricevuto da un ricevitore diverso.By doing this, the prefetched message cannot be received by a different receiver. Se il ricevitore non può completare il messaggio prima della scadenza del blocco, il messaggio diventa disponibile per altri ricevitori.If the receiver cannot complete the message before the lock expires, the message becomes available to other receivers. La copia del messaggio sottoposta a prelettura resta nella cache.The prefetched copy of the message remains in the cache. Il ricevitore che usa la copia scaduta memorizzata nella cache riceve un'eccezione quando prova a completare il messaggio.The receiver that consumes the expired cached copy will receive an exception when it tries to complete that message. Per impostazione predefinita, il blocco del messaggio scade dopo 60 secondi.By default, the message lock expires after 60 seconds. Questo valore può essere esteso a 5 minuti.This value can be extended to 5 minutes. Per evitare che vengano usati messaggi scaduti, la dimensione della cache dovrebbe essere sempre inferiore al numero di messaggi che possono essere usati da un client nell'intervallo di timeout del blocco.To prevent the consumption of expired messages, the cache size should always be smaller than the number of messages that can be consumed by a client within the lock time-out interval.

Se si usa l'impostazione predefinita di 60 secondi per la scadenza del blocco, è consigliabile impostare SubscriptionClient.PrefetchCount su un valore pari a 20 volte la velocità massima di elaborazione di tutti i ricevitori della factory.When using the default lock expiration of 60 seconds, a good value for SubscriptionClient.PrefetchCount is 20 times the maximum processing rates of all receivers of the factory. Ad esempio, una factory crea tre ricevitori e ogni ricevitore può elaborare al massimo 10 messaggi al secondo.For example, a factory creates 3 receivers, and each receiver can process up to 10 messages per second. Il conteggio prelettura non deve superare 20 X 3 X 10 = 600.The prefetch count should not exceed 20 X 3 X 10 = 600. Per impostazione predefinita, la proprietà QueueClient.PrefetchCount è impostata su 0, a indicare che non vengono recuperati altri messaggi dal servizio.By default, QueueClient.PrefetchCount is set to 0, which means that no additional messages are fetched from the service.

La prelettura dei messaggi comporta un aumento della velocità effettiva globale per una coda o una sottoscrizione perché riduce il numero complessivo di operazioni sui messaggi, o round trip.Prefetching messages increases the overall throughput for a queue or subscription because it reduces the overall number of message operations, or round trips. Il recupero del primo messaggio tuttavia richiede più tempo (a causa della dimensione del messaggio aumentata).Fetching the first message, however, will take longer (due to the increased message size). La ricezione di messaggi sottoposti a prelettura sarà più rapida perché questi messaggi sono stati già scaricati dal client.Receiving prefetched messages will be faster because these messages have already been downloaded by the client.

La proprietà di durata (TTL) di un messaggio viene controllata dal server nel momento in cui invia il messaggio al client.The time-to-live (TTL) property of a message is checked by the server at the time the server sends the message to the client. Il client non controlla la proprietà di durata (TTL) del messaggio al momento della ricezione.The client does not check the message’s TTL property when the message is received. Il messaggio può essere ricevuto anche se la relativa durata (TTL) scade durante la memorizzazione nella cache da parte del client.Instead, the message can be received even if the message’s TTL has passed while the message was cached by the client.

La prelettura non influisce sul numero di operazioni di messaggistica fatturabili ed è disponibile solo per il protocollo client del bus di servizio.Prefetching does not affect the number of billable messaging operations, and is available only for the Service Bus client protocol. Il protocollo HTTP non supporta la prelettura.The HTTP protocol does not support prefetching. Questa funzionalità è disponibile per le operazioni di ricezione sincrone e asincrone.Prefetching is available for both synchronous and asynchronous receive operations.

Code e argomenti rapidiExpress queues and topics

Le entità express consentono scenari che prevedono velocità effettiva elevata e latenza minima e sono supportate solo nel livello di messaggistica Standard.Express entities enable high throughput and reduced latency scenarios, and are supported only in the Standard messaging tier. Le entità create negli spazi dei nomi Premium non supportano l'opzione express.Entities created in Premium namespaces do not support the express option. Quando si usano le entità rapide, un messaggio inviato a una coda o a un argomento non viene archiviato immediatamente nell'archivio di messaggistica,With express entities, if a message is sent to a queue or topic, the message is not immediately stored in the messaging store. ma viene memorizzato nella cache in memoria.Instead, it is cached in memory. Se un messaggio resta nella coda per più di alcuni secondi, viene automaticamente scritto in un'archiviazione stabile, proteggendolo così da eventuali perdite a causa di un'interruzione.If a message remains in the queue for more than a few seconds, it is automatically written to stable storage, thus protecting it against loss due to an outage. La scrittura di un messaggio in una cache consente di incrementare la velocità effettiva e di ridurre la latenza, perché al momento dell'invio del messaggio non si verificano tentativi di accesso all'archiviazione stabile.Writing the message into a memory cache increases throughput and reduces latency because there is no access to stable storage at the time the message is sent. I messaggi usati nell'arco di pochi secondi non vengono inseriti nell'archivio di messaggistica.Messages that are consumed within a few seconds are not written to the messaging store. L'esempio seguente illustra la creazione di un argomento rapido.The following example creates an express topic.

TopicDescription td = new TopicDescription(TopicName);
td.EnableExpress = true;
namespaceManager.CreateTopic(td);

Se un messaggio contenente informazioni critiche che non devono andare perdute viene inviato a un'entità espressa, il mittente può forzare il bus di servizio perché mantenga subito e in modo permanente il messaggio nell'archivio stabile impostando la proprietà ForcePersistence su true.If a message containing critical information that must not be lost is sent to an express entity, the sender can force Service Bus to immediately persist the message to stable storage by setting the ForcePersistence property to true.

Nota

Le entità express non supportano le transazioni.Express entities do not support transactions.

Uso di code o argomenti partizionatiUse of partitioned queues or topics

Internamente, il bus di servizio usa lo stesso nodo e lo stesso archivio di messaggistica per elaborare e archiviare tutti i messaggi per un'entità di messaggistica (coda o argomento).Internally, Service Bus uses the same node and messaging store to process and store all messages for a messaging entity (queue or topic). Una coda o un argomento partizionato, al contrario, viene distribuito tra più nodi e archivi di messaggistica.A partitioned queue or topic, on the other hand, is distributed across multiple nodes and messaging stores. Le code e gli argomenti partizionati non solo registrano una velocità effettiva superiore rispetto a quella delle code e degli argomenti normali, ma presentano anche una maggiore disponibilità.Partitioned queues and topics not only yield a higher throughput than regular queues and topics, they also exhibit superior availability. Per creare un'entità partizionata, impostare la proprietà EnablePartitioning su true, come illustrato nell'esempio seguente.To create a partitioned entity, set the EnablePartitioning property to true, as shown in the following example. Per altre informazioni sulle entità partizionate, vedere le entità di messaggistica partizionate.For more information about partitioned entities, see Partitioned messaging entities.

// Create partitioned queue.
QueueDescription qd = new QueueDescription(QueueName);
qd.EnablePartitioning = true;
namespaceManager.CreateQueue(qd);

Uso di più codeUse of multiple queues

Se non è possibile usare una coda o un argomento partizionato o se il carico previsto non può essere gestito da una singola coda o argomento partizionato, è necessario usare più entità di messaggistica.If it is not possible to use a partitioned queue or topic, or the expected load cannot be handled by a single partitioned queue or topic, you must use multiple messaging entities. Se si usano più entità, è consigliabile creare un client dedicato per ogni entità invece di usare lo stesso client per tutte.When using multiple entities, create a dedicated client for each entity, instead of using the same client for all entities.

Funzionalità di sviluppo e testDevelopment and testing features

Il bus di servizio presenta una funzionalità che viene usata in particolare per lo sviluppo e che non deve mai essere usata nelle configurazioni di produzione: TopicDescription.EnableFilteringMessagesBeforePublishing.Service Bus has one feature that is used specifically for development which should never be used in production configurations: TopicDescription.EnableFilteringMessagesBeforePublishing.

Quando vengono aggiunti nuovi filtri o nuove regole all'argomento, è possibile usare TopicDescription.EnableFilteringMessagesBeforePublishing per verificare che la nuova espressione di filtro funzioni come previsto.When new rules or filters are added to the topic, you can use TopicDescription.EnableFilteringMessagesBeforePublishing to verify that the new filter expression is working as expected.

ScenariScenarios

Le sezioni seguenti descrivono scenari di messaggistica tipici e indicano le impostazioni preferibili del bus di servizio.The following sections describe typical messaging scenarios and outline the preferred Service Bus settings. La velocità effettiva è classificata come bassa (minore di 1 messaggio al secondo), moderata (maggiore o uguale a 1 messaggio al secondo ma minore di 100 messaggi al secondo) ed elevata (maggiore o uguale a 100 messaggi al secondo).Throughput rates are classified as small (less than 1 message/second), moderate (1 message/second or greater but less than 100 messages/second) and high (100 messages/second or greater). Il numero di client è classificato come basso (minore o uguale a 5), moderato (maggiore di 5 ma minore o uguale a 20) ed elevato (maggiore di 20).The number of clients are classified as small (5 or fewer), moderate (more than 5 but less than or equal to 20), and large (more than 20).

Coda ad alta velocità effettivaHigh-throughput queue

Obiettivo: aumentare la velocità effettiva di una singola coda.Goal: Maximize the throughput of a single queue. Il numero di mittenti e ricevitori è limitato.The number of senders and receivers is small.

  • Usare una coda partizionata per migliorare prestazioni e disponibilità.Use a partitioned queue for improved performance and availability.
  • Per aumentare la velocità di invio globale nella coda, usare più factory di messaggistica per la creazione di mittenti.To increase the overall send rate into the queue, use multiple message factories to create senders. Per ogni mittente usare operazioni asincrone o più thread.For each sender, use asynchronous operations or multiple threads.
  • Per aumentare la velocità di ricezione globale dalla coda, usare più factory di messaggistica per la creazione di ricevitori.To increase the overall receive rate from the queue, use multiple message factories to create receivers.
  • Usare operazioni asincrone per sfruttare i vantaggi dell'invio in batch sul lato client.Use asynchronous operations to take advantage of client-side batching.
  • Impostare l'intervallo di invio in batch su 50 ms per ridurre il numero di trasmissioni tramite il protocollo client del bus di servizio.Set the batching interval to 50ms to reduce the number of Service Bus client protocol transmissions. Se vengono usati più mittenti, aumentare l'intervallo di invio in batch impostandolo su 100 ms.If multiple senders are used, increase the batching interval to 100ms.
  • Lasciare abilitato l'accesso in batch all'archivio.Leave batched store access enabled. In questo modo si aumenta la velocità complessiva per la scrittura dei messaggi nella coda.This increases the overall rate at which messages can be written into the queue.
  • Impostare il conteggio prelettura su un valore pari a 20 volte la velocità di elaborazione massima di tutti i ricevitori di una factory.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Questo valore riduce il numero di trasmissioni tramite il protocollo client del bus di servizio.This reduces the number of Service Bus client protocol transmissions.

Code multiple ad alta velocità effettivaMultiple high-throughput queues

Obiettivo: aumentare la velocità effettiva complessiva di più code.Goal: Maximize overall throughput of multiple queues. La velocità effettiva di una singola coda è moderata o elevata.The throughput of an individual queue is moderate or high.

Per ottenere la velocità effettiva massima su più code, usare le impostazioni descritte per aumentare la velocità effettiva di una singola coda.To obtain maximum throughput across multiple queues, use the settings outlined to maximize the throughput of a single queue. Usare inoltre factory diverse per creare client che inviano o ricevono da code diverse.In addition, use different factories to create clients that send or receive from different queues.

Coda a bassa latenzaLow latency queue

Obiettivo: ridurre la latenza end-to-end di una coda o di un argomento.Goal: Minimize end-to-end latency of a queue or topic. Il numero di mittenti e ricevitori è limitato.The number of senders and receivers is small. La velocità effettiva della coda è ridotta o moderata.The throughput of the queue is small or moderate.

  • Usare una coda partizionata migliorare la disponibilità.Use a partitioned queue for improved availability.
  • Disabilitare l'invio in batch sul lato client.Disable client-side batching. Il client invia immediatamente un messaggio.The client immediately sends a message.
  • Disabilitare l'accesso in batch all'archivio.Disable batched store access. Il servizio scrive immediatamente il messaggio nell'archivio.The service immediately writes the message to the store.
  • Se si usa un singolo client, impostare il conteggio prelettura su un valore pari a 20 volte la velocità di elaborazione del ricevitore.If using a single client, set the prefetch count to 20 times the processing rate of the receiver. Se più messaggi arrivano nella coda allo stesso tempo, il protocollo client del bus di servizio li trasmette tutti contemporaneamente.If multiple messages arrive at the queue at the same time, the Service Bus client protocol transmits them all at the same time. Quando il client riceve il messaggio successivo, questo è già presente nella cache locale.When the client receives the next message, that message is already in the local cache. La cache deve essere di dimensioni ridotte.The cache should be small.
  • Se si usano più client, impostare il conteggio prelettura su 0.If using multiple clients, set the prefetch count to 0. In questo modo, il secondo client può ricevere il secondo messaggio mentre il primo client sta ancora elaborando il primo messaggio.By doing this, the second client can receive the second message while the first client is still processing the first message.

Coda con un numero elevato di mittentiQueue with a large number of senders

Obiettivo: aumentare la velocità effettiva di una coda o di un argomento con un numero elevato di mittenti.Goal: Maximize throughput of a queue or topic with a large number of senders. Ogni mittente invia messaggi con una velocità moderata.Each sender sends messages with a moderate rate. Il numero di ricevitori è limitato.The number of receivers is small.

Il bus di servizio consente un massimo di 1000 connessioni simultanee a un'entità di messaggistica (o 5000 con AMQP).Service Bus enables up to 1000 concurrent connections to a messaging entity (or 5000 using AMQP). Questo limite viene applicato a livello di spazio dei nomi e le code, le sottoscrizioni o gli argomenti sono limitati in base al numero massimo di connessioni simultanee per spazio dei nomi.This limit is enforced at the namespace level, and queues/topics/subscriptions are capped by the limit of concurrent connections per namespace. Per le code, questo numero è condiviso tra mittenti e ricevitori.For queues, this number is shared between senders and receivers. Se sono necessarie tutte e 1000 le connessioni per i mittenti, è consigliabile sostituire la coda con un argomento e una singola sottoscrizione.If all 1000 connections are required for senders, you should replace the queue with a topic and a single subscription. Un argomento accetta fino a 1000 connessioni simultanee dai mittenti, mentre la sottoscrizione accetta altre 1000 connessioni simultanee dai ricevitori.A topic accepts up to 1000 concurrent connections from senders, whereas the subscription accepts an additional 1000 concurrent connections from receivers. Se sono necessari più di 1000 mittenti simultanei, i mittenti devono inviare i messaggi al protocollo del bus di servizio tramite HTTP.If more than 1000 concurrent senders are required, the senders should send messages to the Service Bus protocol via HTTP.

Per ottimizzare la velocità effettiva, eseguire le operazioni seguenti:To maximize throughput, do the following:

  • Usare una coda partizionata per migliorare prestazioni e disponibilità.Use a partitioned queue for improved performance and availability.
  • Se ogni mittente si trova in un processo diverso, usare solo una singola factory per processo.If each sender resides in a different process, use only a single factory per process.
  • Usare operazioni asincrone per sfruttare i vantaggi dell'invio in batch sul lato client.Use asynchronous operations to take advantage of client-side batching.
  • Usare l'intervallo di invio in batch predefinito di 20 ms per ridurre il numero di trasmissioni tramite il protocollo client del bus di servizio.Use the default batching interval of 20ms to reduce the number of Service Bus client protocol transmissions.
  • Lasciare abilitato l'accesso in batch all'archivio.Leave batched store access enabled. In questo modo si aumenta la velocità complessiva per la scrittura dei messaggi nella coda o nell'argomento.This increases the overall rate at which messages can be written into the queue or topic.
  • Impostare il conteggio prelettura su un valore pari a 20 volte la velocità di elaborazione massima di tutti i ricevitori di una factory.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Questo valore riduce il numero di trasmissioni tramite il protocollo client del bus di servizio.This reduces the number of Service Bus client protocol transmissions.

Coda con un numero elevato di ricevitoriQueue with a large number of receivers

Obiettivo: aumentare la velocità di ricezione di una coda o di una sottoscrizione con un numero elevato di ricevitori.Goal: Maximize the receive rate of a queue or subscription with a large number of receivers. Ogni ricevitore riceve messaggi a una velocità moderata.Each receiver receives messages at a moderate rate. Il numero di mittenti è limitato.The number of senders is small.

Il bus di servizio consente un massimo di 1000 connessioni simultanee a un'entità.Service Bus enables up to 1000 concurrent connections to an entity. Se una coda richiede più di 1000 ricevitori, è consigliabile sostituirla con un argomento e più sottoscrizioni.If a queue requires more than 1000 receivers, you should replace the queue with a topic and multiple subscriptions. Ogni sottoscrizione può supportare fino a 1000 connessioni simultanee.Each subscription can support up to 1000 concurrent connections. In alternativa, i ricevitori possono accedere alla coda tramite il protocollo HTTP.Alternatively, receivers can access the queue via the HTTP protocol.

Per ottimizzare la velocità effettiva, eseguire le operazioni seguenti:To maximize throughput, do the following:

  • Usare una coda partizionata per migliorare prestazioni e disponibilità.Use a partitioned queue for improved performance and availability.
  • Se ogni ricevitore si trova in un processo diverso, usare solo una singola factory per processo.If each receiver resides in a different process, use only a single factory per process.
  • I ricevitori possono usare operazioni sincrone o asincrone.Receivers can use synchronous or asynchronous operations. Considerata la velocità di ricezione moderata di un singolo ricevitore, l'invio in batch sul lato client di una richiesta Complete non influisce sulla velocità effettiva del ricevitore.Given the moderate receive rate of an individual receiver, client-side batching of a Complete request does not affect receiver throughput.
  • Lasciare abilitato l'accesso in batch all'archivio.Leave batched store access enabled. In questo modo si riduce il carico complessivo dell'entità.This reduces the overall load of the entity. Si riduce anche la velocità globale per la scrittura dei messaggi nella coda o nell'argomento.It also reduces the overall rate at which messages can be written into the queue or topic.
  • Impostare il conteggio prelettura su un valore ridotto, ad esempio PrefetchCount = 10.Set the prefetch count to a small value (for example, PrefetchCount = 10). In questo modo si evita che i ricevitori rimangano inattivi mentre per altri è presente un numero elevato di messaggi memorizzati nella cache.This prevents receivers from being idle while other receivers have large numbers of messages cached.

Argomento con un numero limitato di sottoscrizioniTopic with a small number of subscriptions

Obiettivo: aumentare la velocità effettiva di un argomento con un numero limitato di sottoscrizioni.Goal: Maximize the throughput of a topic with a small number of subscriptions. Poiché un messaggio viene ricevuto da molte sottoscrizioni, la velocità di ricezione combinata su tutte le sottoscrizioni è superiore alla velocità di invio.A message is received by many subscriptions, which means the combined receive rate over all subscriptions is larger than the send rate. Il numero di mittenti è limitato.The number of senders is small. Il numero di ricevitori per sottoscrizione è limitato.The number of receivers per subscription is small.

Per ottimizzare la velocità effettiva, eseguire le operazioni seguenti:To maximize throughput, do the following:

  • Usare un argomento partizionato per migliorare prestazioni e disponibilità.Use a partitioned topic for improved performance and availability.
  • Per aumentare la velocità di invio globale nell'argomento, usare più factory di messaggistica per la creazione di mittenti.To increase the overall send rate into the topic, use multiple message factories to create senders. Per ogni mittente usare operazioni asincrone o più thread.For each sender, use asynchronous operations or multiple threads.
  • Per aumentare la velocità di ricezione globale di una sottoscrizione, usare più factory di messaggistica per la creazione di ricevitori.To increase the overall receive rate from a subscription, use multiple message factories to create receivers. Per ogni ricevitore usare operazioni asincrone o più thread.For each receiver, use asynchronous operations or multiple threads.
  • Usare operazioni asincrone per sfruttare i vantaggi dell'invio in batch sul lato client.Use asynchronous operations to take advantage of client-side batching.
  • Usare l'intervallo di invio in batch predefinito di 20 ms per ridurre il numero di trasmissioni tramite il protocollo client del bus di servizio.Use the default batching interval of 20ms to reduce the number of Service Bus client protocol transmissions.
  • Lasciare abilitato l'accesso in batch all'archivio.Leave batched store access enabled. In questo modo si aumenta la velocità globale per la scrittura dei messaggi nell'argomento.This increases the overall rate at which messages can be written into the topic.
  • Impostare il conteggio prelettura su un valore pari a 20 volte la velocità di elaborazione massima di tutti i ricevitori di una factory.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Questo valore riduce il numero di trasmissioni tramite il protocollo client del bus di servizio.This reduces the number of Service Bus client protocol transmissions.

Argomento con un numero elevato di sottoscrizioniTopic with a large number of subscriptions

Obiettivo: aumentare la velocità effettiva di un argomento con un numero elevato di sottoscrizioni.Goal: Maximize the throughput of a topic with a large number of subscriptions. Poiché un messaggio viene ricevuto da molte sottoscrizioni, la velocità di ricezione combinata su tutte le sottoscrizioni è superiore rispetto alla velocità di invio.A message is received by many subscriptions, which means the combined receive rate over all subscriptions is much larger than the send rate. Il numero di mittenti è limitato.The number of senders is small. Il numero di ricevitori per sottoscrizione è limitato.The number of receivers per subscription is small.

Gli argomenti con un numero elevato di sottoscrizioni in genere espongono una velocità effettiva globale ridotta se tutti i messaggi vengono instradati a tutte le sottoscrizioni.Topics with a large number of subscriptions typically expose a low overall throughput if all messages are routed to all subscriptions. Questo dipende dal fatto che ogni messaggio viene ricevuto più volte e che tutti i messaggi contenuti in un argomento e tutte le relative sottoscrizioni vengono salvati nello stesso archivio.This is caused by the fact that each message is received many times, and all messages that are contained in a topic and all its subscriptions are stored in the same store. Si presuppone che il numero di mittenti e il numero di ricevitori per sottoscrizione sia ridotto.It is assumed that the number of senders and number of receivers per subscription is small. Il bus di servizio supporta fino a 2.000 sottoscrizioni per argomento.Service Bus supports up to 2,000 subscriptions per topic.

Per ottimizzare la velocità effettiva, eseguire le operazioni seguenti:To maximize throughput, do the following:

  • Usare un argomento partizionato per migliorare prestazioni e disponibilità.Use a partitioned topic for improved performance and availability.
  • Usare operazioni asincrone per sfruttare i vantaggi dell'invio in batch sul lato client.Use asynchronous operations to take advantage of client-side batching.
  • Usare l'intervallo di invio in batch predefinito di 20 ms per ridurre il numero di trasmissioni tramite il protocollo client del bus di servizio.Use the default batching interval of 20ms to reduce the number of Service Bus client protocol transmissions.
  • Lasciare abilitato l'accesso in batch all'archivio.Leave batched store access enabled. In questo modo si aumenta la velocità globale per la scrittura dei messaggi nell'argomento.This increases the overall rate at which messages can be written into the topic.
  • Impostare il conteggio prelettura su un valore pari a 20 volte la velocità di ricezione prevista in secondi.Set the prefetch count to 20 times the expected receive rate in seconds. Questo valore riduce il numero di trasmissioni tramite il protocollo client del bus di servizio.This reduces the number of Service Bus client protocol transmissions.

Passaggi successiviNext steps

Per altre informazioni sull'ottimizzazione delle prestazioni del bus di servizio, vedere le entità di messaggistica partizionate.To learn more about optimizing Service Bus performance, see Partitioned messaging entities.