Meilleures pratiques relatives aux améliorations de performances à l’aide de la messagerie Service BusBest Practices for performance improvements using Service Bus Messaging

Cet article décrit comment utiliser Azure Service Bus pour optimiser les performances lors de l’échange de messages répartis.This article describes how to use Azure Service Bus to optimize performance when exchanging brokered messages. La première partie de cet article décrit les différents mécanismes proposés afin d’améliorer les performances.The first part of this article describes the different mechanisms that are offered to help increase performance. La deuxième partie fournit des conseils sur l’utilisation de Service Bus des services visant à offrir des performances optimales dans un scénario donné.The second part provides guidance on how to use Service Bus in a way that can offer the best performance in a given scenario.

Dans cet article, le terme « client » fait référence à une entité qui accède à Service Bus.Throughout this article, the term "client" refers to any entity that accesses Service Bus. Un client peut jouer le rôle d’un expéditeur ou d’un destinataire.A client can take the role of a sender or a receiver. Le terme « expéditeur » est utilisé pour un client de file d’attente ou de rubrique Service Bus qui envoie des messages à une file d’attente ou un abonnement à une rubrique Service Bus.The term "sender" is used for a Service Bus queue or topic client that sends messages to a Service Bus queue or topic subscription. Le terme « destinataire » fait référence à un client de file d’attente ou d’abonnement de Bus de Service qui reçoit des messages de la part d’une file d’attente ou d’un abonnement Service Bus.The term "receiver" refers to a Service Bus queue or subscription client that receives messages from a Service Bus queue or subscription.

Les sections suivantes présentent plusieurs concepts Service Bus utiles pour améliorer les performances.These sections introduce several concepts that Service Bus uses to help boost performance.

ProtocolesProtocols

Service Bus permet aux clients d’envoyer et de recevoir des messages par le biais de l’un des trois protocoles suivants :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 et SBMP sont plus efficaces, car ils maintiennent la connexion au Service Bus tant que la fabrique de messagerie existe.AMQP and SBMP are more efficient, because they maintain the connection to Service Bus as long as the messaging factory exists. Il permet également le traitement par lot et la lecture anticipée.It also implements batching and prefetching. Sauf mention explicite, tout le contenu de cet article suppose l’utilisation du protocole AMQP ou SBMP.Unless explicitly mentioned, all content in this article assumes the use of AMQP or SBMP.

Réutilisation de structures et de clientsReusing factories and clients

Des objets client Service Bus, tels que QueueClient ou MessageSender, sont créés via un objet MessagingFactory, qui assure également la gestion interne des connexions.Service Bus client objects, such as QueueClient or MessageSender, are created through a MessagingFactory object, which also provides internal management of connections. Il est déconseillé de fermer les structures de messagerie ou les files d’attente, les rubriques et les clients d’abonnement après avoir envoyé un message, et de les recréer lorsque vous envoyez le message suivant.It is recommended that you do 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. La fermeture d’une structure de messagerie supprime la connexion à Service Bus et une nouvelle connexion est établie au moment de la recréation de la structure.Closing a messaging factory deletes the connection to the Service Bus service, and a new connection is established when recreating the factory. L’établissement d’une connexion est une opération coûteuse, que vous pouvez éviter en réutilisant les objets de structure et client dans plusieurs opérations.Establishing a connection is an expensive operation that you can avoid by reusing the same factory and client objects for multiple operations. Vous pouvez utiliser en toute sécurité ces objets clients pour envoyer des messages à partir de plusieurs threads et d’opérations asynchrones simultanées.You can safely use these client objects for concurrent asynchronous operations and from multiple threads.

Opérations simultanéesConcurrent operations

L’exécution d’une opération (envoi, réception, suppression, etc.) prend un certain temps.Performing an operation (send, receive, delete, etc.) takes some time. Ce temps comprend le traitement de l’opération par le service Service Bus en plus de la latence de la demande et de la réponse.This time includes the processing of the operation by the Service Bus service in addition to the latency of the request and the reply. Pour augmenter le nombre d’opérations par période, les opérations doivent s’exécuter simultanément.To increase the number of operations per time, operations must execute concurrently.

Le client planifie les opérations parallèles en effectuant des opérations asynchrones.The client schedules concurrent operations by performing asynchronous operations. La requête suivante démarre avant la fin de la demande précédente.The next request is started before the previous request is completed. Voici un exemple d’opération d’envoi asynchrone présenté sous forme d’extrait de code :The following code snippet is an example of an asynchronous send operation:

 Message m1 = new BrokeredMessage(body);
 Message 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");

Voici un exemple d’opération de réception asynchrone présenté sous forme de code.The following code is an example of an asynchronous receive operation. Consultez le programme complet ici :See the full program here:

var receiver = new MessageReceiver(connectionString, queueName, ReceiveMode.PeekLock);
var doneReceiving = new TaskCompletionSource<bool>();

receiver.RegisterMessageHandler(...);

Mode de réceptionReceive mode

Lorsque vous créez un client de file d’attente ou d’abonnement, vous pouvez spécifier un mode de réception : Verrouillage ou Recevoir et supprimer.When creating a queue or subscription client, you can specify a receive mode: Peek-lock or Receive and Delete. Le mode par défaut est Verrouillage.The default receive mode is PeekLock. Lorsqu’il fonctionne dans ce mode, le client envoie une demande pour recevoir un message de la part de Service Bus.When operating in this mode, the client sends a request to receive a message from Service Bus. Une fois que le client a reçu le message, il envoie une demande pour compléter le message.After the client has received the message, it sends a request to complete the message.

Lors de la définition du mode de réception ReceiveAndDelete, les deux étapes sont combinées dans une requête unique.When setting the receive mode to ReceiveAndDelete, both steps are combined in a single request. Cette étape réduit le nombre total d’opérations et peut améliorer le débit global des messages.These steps reduce the overall number of operations, and can improve the overall message throughput. Ce gain de performances est fourni au risque de perdre des messages.This performance gain comes at the risk of losing messages.

Service Bus ne gère pas les transactions des opérations de réception-suppression.Service Bus does not support transactions for receive-and-delete operations. En outre, la syntaxe de verrouillage est nécessaire pour tous les scénarios dans lesquels le client souhaite différer ou ignorer un message (lettre morte).In addition, peek-lock semantics are required for any scenarios in which the client wants to defer or dead-letter a message.

Traitement par lots côté clientClient-side batching

Le traitement par lot côté client permet à un client de file d’attente ou de rubrique de retarder l’envoi d’un message pendant une période donnée.Client-side batching enables a queue or topic client to delay the sending of a message for a certain period of time. Si le client envoie des messages supplémentaires pendant cette période, il transmet les messages dans un seul lot.If the client sends additional messages during this time period, it transmits the messages in a single batch. Le traitement par lots côté client fait également en sorte qu’une file d’attente ou un abonnement client regroupe plusieurs requêtes complètes en une seule requête.Client-side batching also causes a queue or subscription client to batch multiple Complete requests into a single request. Le traitement par lots n’est disponible que pour les opérations d’envoi et complètes asynchrones.Batching is only available for asynchronous Send and Complete operations. Les opérations synchrones sont immédiatement envoyées au service Service Bus.Synchronous operations are immediately sent to the Service Bus service. Le traitement par lots ne peut pas concerner des opérations de verrouillage ou de réception, ou plusieurs clients.Batching does not occur for peek or receive operations, nor does batching occur across clients.

Par défaut, un client utilise un intervalle 20 ms entre les lots.By default, a client uses a batch interval of 20 ms. Vous pouvez modifier l’intervalle de traitement par lots en définissant la propriété BatchFlushInterval avant de créer la structure de messagerie.You can change the batch interval by setting the BatchFlushInterval property before creating the messaging factory. Ce paramètre affecte tous les clients créés par cette structure.This setting affects all clients that are created by this factory.

Pour désactiver le traitement par lot, définissez la propriété BatchFlushInterval sur TimeSpan.Zero.To disable batching, set the BatchFlushInterval property to TimeSpan.Zero. Par exemple :For example:

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

Le traitement par lot n’affecte pas le nombre d’opérations de messagerie facturables et est disponible uniquement pour le protocole client Service Bus utilisant la bibliothèque Microsoft.ServiceBus.Messaging.Batching does not affect the number of billable messaging operations, and is available only for the Service Bus client protocol using the Microsoft.ServiceBus.Messaging library. Le protocole HTTP ne prend pas en charge le traitement par lot.The HTTP protocol does not support batching.

Notes

La définition de BatchFlushInterval garantit que le traitement par lot est implicite du point de vue de l’application.Setting BatchFlushInterval ensures that the batching is implicit from the application's perspective. Autrement dit, l’application effectue des appels SendAsync() et CompleteAsync() et n’effectue pas d’appels Batch spécifiques.i.e. The application makes SendAsync() and CompleteAsync() calls and does not make specific Batch calls.

Le traitement par lot explicite du côté client peut être implémenté en utilisant la méthode d’appel ci-dessous :Explicit client side batching can be implemented by utilizing the below method call -

Task SendBatchAsync (IEnumerable<BrokeredMessage> messages);

Ici, la taille combinée des messages doit être inférieure à la taille maximale prise en charge par le niveau tarifaire.Here the combined size of the messages must be less than the maximum size supported by the pricing tier.

Accès au dispositif de stockage de traitement par lotBatching store access

Pour augmenter le débit d’une file d’attente, d’une rubrique ou d’un abonnement, Service Bus regroupe plusieurs messages lorsqu’il écrit à son dispositif de stockage en interne.To increase the throughput of a queue, topic, or subscription, Service Bus batches multiple messages when it writes to its internal store. S’il est activé sur une file d’attente ou une rubrique, l’écriture de messages dans le dispositif de stockage est traitée par lot.If enabled on a queue or topic, writing messages into the store will be batched. S’il est activé sur une file d’attente ou un abonnement, l’écriture de messages depuis le dispositif de stockage est traitée par lot.If enabled on a queue or subscription, deleting messages from the store will be batched. Si l’accès au magasin par lot est activé pour une entité, Service Bus retarde l’opération d’écriture de dispositif de stockage concernant cette entité de 20 ms au maximum.If batched store access is enabled for an entity, Service Bus delays a store write operation regarding that entity by up to 20 ms.

Notes

Il n’existe aucun risque de perdre des messages avec le traitement par lot, même en cas de défaillance de Service Bus à la fin d’un intervalle de traitement par lot de 20 ms.There is no risk of losing messages with batching, even if there is a Service Bus failure at the end of a 20ms batching interval.

Les opérations de stockage supplémentaires qui se produisent pendant cet intervalle sont ajoutées au lot.Additional store operations that occur during this interval are added to the batch. L’accès au dispositif de stockage par lot affecte seulement les opérations d’envoi et complètes ; les opérations de réception ne sont pas affectées.Batched store access only affects Send and Complete operations; receive operations are not affected. L’accès au dispositif de stockage est une propriété d’entité.Batched store access is a property on an entity. Le traitement par lot se produit sur toutes les entités qui permettent l’accès au stockage par lot.Batching occurs across all entities that enable batched store access.

Lorsque vous créez une file d’attente, une rubrique ou un abonnement, l’accès au stockage par lot est activé par défaut.When creating a new queue, topic or subscription, batched store access is enabled by default. Pour désactiver l’accès au stockage par lot, définissez la propriété EnableBatchedOperations sur false avant de créer l’entité.To disable batched store access, set the EnableBatchedOperations property to false before creating the entity. Par exemple :For example:

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

L’accès au stockage par lot n’affecte pas le nombre d’opérations de messagerie facturables et constitue une propriété de file d’attente, de rubrique ou d’abonnement.Batched store access does not affect the number of billable messaging operations, and is a property of a queue, topic, or subscription. Il est indépendant du mode de réception et du protocole utilisé entre un client et le service Service Bus.It is independent of the receive mode and the protocol that is used between a client and the Service Bus service.

Lecture anticipéePrefetching

La lecture anticipée permet au client de la file d’attente ou de l’abonnement de charger des messages supplémentaires à partir du service quand il effectue une opération de réception.Prefetching enables the queue or subscription client to load additional messages from the service when it performs a receive operation. Le client stocke ces messages en mémoire cache.The client stores these messages in a local cache. La taille du cache est déterminée par la propriété QueueClient.PrefetchCount ou SubscriptionClient.PrefetchCount.The size of the cache is determined by the QueueClient.PrefetchCount or SubscriptionClient.PrefetchCount properties. Chaque client qui permet la lecture anticipée gère son propre cache.Each client that enables prefetching maintains its own cache. Un cache n’est pas partagé par plusieurs clients.A cache is not shared across clients. Si le client initie une opération de réception et que sa mémoire cache est vide, le service transmet un lot de messages.If the client initiates a receive operation and its cache is empty, the service transmits a batch of messages. La taille du lot est égale à la taille du cache ou à 256 Ko, la plus faible l’emportant.The size of the batch equals the size of the cache or 256 KB, whichever is smaller. Si le client initie une opération de réception et que le cache contient un message, ce dernier est extrait de la mémoire cache.If the client initiates a receive operation and the cache contains a message, the message is taken from the cache.

Lorsqu’un message est lu par anticipation, le service le verrouille.When a message is prefetched, the service locks the prefetched message. Ainsi, le message lu par anticipation ne peut pas être reçu par un autre destinataire.With the lock, the prefetched message cannot be received by a different receiver. Si le destinataire ne peut pas terminer le message avant expiration du verrouillage, le message devient disponible pour les autres destinataires.If the receiver cannot complete the message before the lock expires, the message becomes available to other receivers. La copie lue par anticipation du message reste dans le cache.The prefetched copy of the message remains in the cache. Le destinataire qui consomme la copie mise en cache expirée reçoit une exception lorsqu’il essaie de terminer le message.The receiver that consumes the expired cached copy will receive an exception when it tries to complete that message. Par défaut, le verrouillage du message expire au bout de 60 secondes.By default, the message lock expires after 60 seconds. Cette valeur peut être étendue à 5 minutes.This value can be extended to 5 minutes. Pour empêcher la consommation des messages arrivés à expiration, la taille du cache doit toujours être inférieure au nombre de messages qui peuvent être utilisés par un client au sein de l’intervalle de délai d’expiration de verrouillage.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.

Lorsque vous utilisez l’expiration de verrouillage par défaut (60 secondes), il est judicieux d’attribuer à PrefetchCount une valeur correspondant à 20 fois la vitesse de traitement de l’ensemble des destinataires présents dans la structure.When using the default lock expiration of 60 seconds, a good value for PrefetchCount is 20 times the maximum processing rates of all receivers of the factory. Par exemple, une structure crée 10 destinataires, et chaque destinataire peut traiter jusqu’à 10 messages par seconde.For example, a factory creates three receivers, and each receiver can process up to 10 messages per second. Le nombre de lectures anticipées ne doit pas dépasser 20 X 3 X 10 = 600.The prefetch count should not exceed 20 X 3 X 10 = 600. Par défaut, PrefetchCount est définie sur 0, ce qui signifie qu’aucun message supplémentaire n’est récupéré à partir du service.By default, PrefetchCount is set to 0, which means that no additional messages are fetched from the service.

La lecture anticipée de messages augmente le débit global d’un abonnement ou une file d’attente, car elle permet de réduire le nombre total d’opérations de messagerie, ou les allers-retours.Prefetching messages increases the overall throughput for a queue or subscription because it reduces the overall number of message operations, or round trips. La lecture anticipée du premier message, cependant, prend plus de temps (en raison de la taille du message accrue).Fetching the first message, however, will take longer (due to the increased message size). La réception de message avec lecture anticipée sera plus rapide, car ces messages ont déjà été téléchargés par le client.Receiving prefetched messages will be faster because these messages have already been downloaded by the client.

La propriété (TTL) de durée de vie d’un message est vérifiée par le serveur au moment où le serveur envoie le message au 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. Le client ne vérifie pas la propriété TTL de durée de vie du message à la réception du message.The client does not check the message’s TTL property when the message is received. Toutefois, le message peut être reçu même si la durée de vie du message a été dépassée pensant la mise en mémoire cache par le client.Instead, the message can be received even if the message’s TTL has passed while the message was cached by the client.

La lecture anticipée n’affecte pas le nombre d’opérations de messagerie facturables et est disponible uniquement pour le protocole client Service Bus.Prefetching does not affect the number of billable messaging operations, and is available only for the Service Bus client protocol. Le protocole HTTP ne prend pas en charge la lecture anticipée.The HTTP protocol does not support prefetching. La lecture anticipée est disponible pour les opérations de réception synchrones et asynchrones.Prefetching is available for both synchronous and asynchronous receive operations.

Prérécupération et ReceiveBatchPrefetching and ReceiveBatch

Même si les concepts liés à la prérécupération de plusieurs messages ensemble présentent une sémantique similaire au traitement des messages dans un lot (ReceiveBatch), il existe quelques différences mineures qui doivent être gardées à l’esprit lorsque vous tirez parti simultanément de ces éléments.While the concepts of prefetching multiple messages together have similar semantics to processing messages in a batch (ReceiveBatch), there are some minor differences that must be kept in mind when leveraging these together.

La prérécupération est une configuration (ou un mode) sur le client (QueueClient et SubscriptionClient) tandis que ReceiveBatch est une opération (qui possède une sémantique requête-réponse).Prefetch is a configuration (or mode) on the client (QueueClient and SubscriptionClient) and ReceiveBatch is an operation (that has request-response semantics).

Lors de l’utilisation conjointe de ces éléments, envisagez les cas suivants :While using these together, consider the following cases -

  • Le nombre de prérécupérations doit être supérieur ou égal au nombre de messages que vous vous attendez à recevoir de ReceiveBatch.Prefetch should be greater than or equal to the number of messages you are expecting to receive from ReceiveBatch.
  • Le nombre de prérécupérations peut aller jusqu’à n/3 fois le nombre de messages traités par seconde, sachant que n est la durée de verrouillage par défaut.Prefetch can be up to n/3 times the number of messages processed per second, where n is the default lock duration.

Quelques difficultés surviennent lors d’une approche gourmande (par exemple, en conservant le nombre de prérécupérations très élevé), car cela implique le verrouillage du message sur un récepteur particulier.There are some challenges with having a greedy approach(i.e. keeping the prefetch count very high), because it implies that the message is locked to a particular receiver. La recommandation à suivre est d’essayer des valeurs de prérécupération entre les seuils mentionnés ci-dessus et d’identifier empiriquement ce qui convient.The recommendation is to try out prefetch values between the thresholds mentioned above and empirically identify what fits.

Files d’attente multiplesMultiple queues

Si la charge prévue ne peut pas être gérée par une seule file d’attente ou rubrique partitionnée, vous devez utiliser plusieurs entités de messagerie.If the expected load cannot be handled by a single partitioned queue or topic, you must use multiple messaging entities. Lorsque vous utilisez plusieurs entités, créez un client dédié pour chacune d’elles au lieu d’utiliser le même client pour toutes les entités.When using multiple entities, create a dedicated client for each entity, instead of using the same client for all entities.

Fonctionnalités de développement et de testDevelopment and testing features

Service Bus possède une fonctionnalité qui est utilisée spécifiquement pour le développement, qui ne doit jamais être utilisée dans les configurations de production : TopicDescription.EnableFilteringMessagesBeforePublishing.Service Bus has one feature, used specifically for development, which should never be used in production configurations: TopicDescription.EnableFilteringMessagesBeforePublishing.

Lorsque de nouvelles règles ou des filtres sont ajoutés à la rubrique, vous pouvez utiliser TopicDescription.EnableFilteringMessagesBeforePublishing pour vérifier que la nouvelle expression de filtre fonctionne comme prévu.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.

ScénariosScenarios

Les sections suivantes décrivent les scénarios de messagerie classiques et soulignent les paramètres Service Bus favoris par défaut.The following sections describe typical messaging scenarios and outline the preferred Service Bus settings. Les débits sont classés dans la catégorie Petit (moins d’1 message/seconde), Modéré (1 message/s ou plus, mais moins de 100 messages par seconde) et Élevé (100 messages/seconde ou plus).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). Le nombre de clients est classé en tant que petit (5 ou moins), modéré (plus de 5, mais inférieur ou égal à 20) et grand (plus de 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).

File d’attente à débit élevéHigh-throughput queue

Objectif : Maximiser le débit d’une file d’attente unique.Goal: Maximize the throughput of a single queue. Le nombre d’expéditeurs et de destinataires est faible.The number of senders and receivers is small.

  • Pour augmenter la vitesse de transmission globale dans la file d’attente, utilisez plusieurs structures de messages pour créer des expéditeurs.To increase the overall send rate into the queue, use multiple message factories to create senders. Pour chaque expéditeur, utilisez des opérations asynchrones ou plusieurs threads.For each sender, use asynchronous operations or multiple threads.
  • Pour augmenter la vitesse de réception depuis la file d’attente, utilisez plusieurs structures de messages pour créer des destinataires.To increase the overall receive rate from the queue, use multiple message factories to create receivers.
  • Utilisez des opérations asynchrones pour tirer parti du traitement par lot côté client.Use asynchronous operations to take advantage of client-side batching.
  • Définissez l’intervalle de mise en lot sur 50 ms pour réduire le nombre de transmissions de protocole client Service Bus.Set the batching interval to 50 ms to reduce the number of Service Bus client protocol transmissions. Si plusieurs expéditeurs sont utilisés, augmentez l’intervalle de traitement par lot à 100 ms.If multiple senders are used, increase the batching interval to 100 ms.
  • Désactivez l’accès au magasin par lot.Leave batched store access enabled. Cet accès augmente la cadence à laquelle les messages peuvent être écrits dans la file d’attente.This access increases the overall rate at which messages can be written into the queue.
  • Définissez le nombre de lectures anticipées à 20 fois la vitesse de traitement maximale de la totalité des destinataires d’une structure.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Cela réduit le nombre de transmissions de protocole client Service Bus.This count reduces the number of Service Bus client protocol transmissions.
  • Utilisez une file d’attente partitionnée pour améliorer les performances et la disponibilité.Use a partitioned queue for improved performance and availability.

Plusieurs files d’attente haut débitMultiple high-throughput queues

Objectif : Optimiser le débit global de plusieurs files d’attente.Goal: Maximize overall throughput of multiple queues. Le débit d’une file d’attente individuelle est modéré ou élevé.The throughput of an individual queue is moderate or high.

Pour obtenir un débit maximal sur plusieurs files d’attente, utiliser les paramètres conseillés pour maximiser le débit d’une file d’attente unique.To obtain maximum throughput across multiple queues, use the settings outlined to maximize the throughput of a single queue. En outre, utiliser des structures différentes pour créer des clients procédant à des envois ou des réceptions de la part de différentes files d’attente.In addition, use different factories to create clients that send or receive from different queues.

File d’attente à latence faibleLow latency queue

Objectif : Réduire la latence de bout en bout d’une file d’attente ou d’une rubrique.Goal: Minimize end-to-end latency of a queue or topic. Le nombre d’expéditeurs et de destinataires est faible.The number of senders and receivers is small. Le débit de la file d’attente est faible ou modéré.The throughput of the queue is small or moderate.

  • Désactiver le traitement par lots côté client.Disable client-side batching. Le client envoie immédiatement un message.The client immediately sends a message.
  • Désactiver l’accès au magasin par lot.Disable batched store access. Le service écrit immédiatement le message pour le magasin.The service immediately writes the message to the store.
  • Si vous utilisez un seul client, définissez le nombre de lectures anticipées à 20 fois la vitesse de traitement du destinataire.If using a single client, set the prefetch count to 20 times the processing rate of the receiver. Si plusieurs messages arrivent à la file d’attente en même temps, le protocole client Service Bus les transmet tous simultanément.If multiple messages arrive at the queue at the same time, the Service Bus client protocol transmits them all at the same time. Lorsque le client reçoit le message suivant, ce message est déjà dans le cache local.When the client receives the next message, that message is already in the local cache. Le cache doit être de petite taille.The cache should be small.
  • Si vous utilisez plusieurs clients, définissez le nombre de lectures anticipées sur 0.If using multiple clients, set the prefetch count to 0. Ainsi, le deuxième client peut recevoir le deuxième message alors que le premier client traite toujours le premier message.By setting the count, the second client can receive the second message while the first client is still processing the first message.
  • Utilisez une file d’attente partitionnée pour améliorer les performances et la disponibilité.Use a partitioned queue for improved performance and availability.

File d’attente comportant un grand nombre d’expéditeursQueue with a large number of senders

Objectif : Maximiser le débit d’une file d’attente ou d’une rubrique comportant un grand nombre d’expéditeurs.Goal: Maximize throughput of a queue or topic with a large number of senders. Chaque expéditeur envoie des messages à une vitesse modérée.Each sender sends messages with a moderate rate. Le nombre de destinataires est faible.The number of receivers is small.

Service Bus permet jusqu’à 1 000 connexions simultanées vers une entité de messagerie (ou 5 000 avec AMQP).Service Bus enables up to 1000 concurrent connections to a messaging entity (or 5000 using AMQP). Cette limite s’applique au niveau de l’espace de noms et les rubriques/files d’attente/abonnements sont limités par la limite de connexions simultanées par espace de noms.This limit is enforced at the namespace level, and queues/topics/subscriptions are capped by the limit of concurrent connections per namespace. Pour les files d’attente, ce nombre est partagé entre les expéditeurs et les destinataires.For queues, this number is shared between senders and receivers. Si les 1 000 connexions sont requises pour les expéditeurs, remplacez la file d’attente par une rubrique et un seul abonnement.If all 1000 connections are required for senders, replace the queue with a topic and a single subscription. Une rubrique accepte jusqu’à 1 000 connexions simultanées provenant d’expéditeurs, alors que l’abonnement accepte un 1 000 connexions simultanées destinataires.A topic accepts up to 1000 concurrent connections from senders, whereas the subscription accepts an additional 1000 concurrent connections from receivers. Si plus de 1 000 expéditeurs simultanés sont requis, les expéditeurs doivent envoyer leurs messages vers le protocole de Service Bus via HTTP.If more than 1000 concurrent senders are required, the senders should send messages to the Service Bus protocol via HTTP.

Pour maximiser le débit, procédez comme suit :To maximize throughput, perform the following steps:

  • Si chaque expéditeur réside dans un processus différent, utilisez uniquement une structure par processus.If each sender resides in a different process, use only a single factory per process.
  • Utilisez des opérations asynchrones pour tirer parti du traitement par lot côté client.Use asynchronous operations to take advantage of client-side batching.
  • Utilisez la valeur par défaut de l’intervalle de 20 ms pour réduire le nombre de transmissions de protocole client Service Bus.Use the default batching interval of 20 ms to reduce the number of Service Bus client protocol transmissions.
  • Désactivez l’accès au magasin par lot.Leave batched store access enabled. Cet accès augmente la cadence à laquelle les messages peuvent être écrits dans la file d’attente ou la rubrique.This access increases the overall rate at which messages can be written into the queue or topic.
  • Définissez le nombre de lectures anticipées à 20 fois la vitesse de traitement maximale de la totalité des destinataires d’une structure.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Cela réduit le nombre de transmissions de protocole client Service Bus.This count reduces the number of Service Bus client protocol transmissions.
  • Utilisez une file d’attente partitionnée pour améliorer les performances et la disponibilité.Use a partitioned queue for improved performance and availability.

File d’attente comportant un grand nombre de destinatairesQueue with a large number of receivers

Objectif : Optimiser la vitesse de réception d’une file d’attente ou d’abonnement comportant un grand nombre de destinataires.Goal: Maximize the receive rate of a queue or subscription with a large number of receivers. Chaque destinataire reçoit les messages à une vitesse modérée.Each receiver receives messages at a moderate rate. Le nombre d’expéditeurs est faible.The number of senders is small.

Service Bus permet jusqu’à 1 000 connexions simultanées vers une entité.Service Bus enables up to 1000 concurrent connections to an entity. Si une file d’attente nécessite plus de 1 000 destinataires, remplacez la file d’attente par une rubrique et plusieurs abonnements.If a queue requires more than 1000 receivers, replace the queue with a topic and multiple subscriptions. Chaque abonnement peut prendre en charge jusqu’à 1 000 connexions simultanées.Each subscription can support up to 1000 concurrent connections. Les destinataires peuvent également accéder à la file d’attente via le protocole HTTP.Alternatively, receivers can access the queue via the HTTP protocol.

Pour maximiser le débit, procédez comme suit :To maximize throughput, do the following:

  • Si chaque destinataire réside dans un processus différent, utilisez uniquement une structure par processus.If each receiver resides in a different process, use only a single factory per process.
  • Les récepteurs peuvent utiliser des opérations synchronisées ou asynchrones.Receivers can use synchronous or asynchronous operations. Étant donné la vitesse de réception modérée d’un destinataire individuel, le traitement côté client de la demande complète n’affecte pas le débit du destinataire.Given the moderate receive rate of an individual receiver, client-side batching of a Complete request does not affect receiver throughput.
  • Désactivez l’accès au magasin par lot.Leave batched store access enabled. Cet accès réduit la charge globale de l’entité.This access reduces the overall load of the entity. Cette opération réduit également la cadence générale à laquelle les messages peuvent être écrits dans la file d’attente ou la rubrique.It also reduces the overall rate at which messages can be written into the queue or topic.
  • Définir le nombre de lectures anticipées sur une valeur faible (par exemple, PrefetchCount = 10).Set the prefetch count to a small value (for example, PrefetchCount = 10). Cela empêche les destinataires de rester oisifs pendant que d’autres mettent en cache un grand nombre de messages.This count prevents receivers from being idle while other receivers have large numbers of messages cached.
  • Utilisez une file d’attente partitionnée pour améliorer les performances et la disponibilité.Use a partitioned queue for improved performance and availability.

Rubrique comportant un petit nombre d’abonnementsTopic with a small number of subscriptions

Objectif : Maximiser le débit d’une rubrique comportant un petit nombre d’abonnements.Goal: Maximize the throughput of a topic with a small number of subscriptions. Un message est reçu par un grand nombre d’abonnements, ce qui signifie que la vitesse de réception combinée sur l’ensemble des abonnements est supérieure à la vitesse d’envoi.A message is received by many subscriptions, which means the combined receive rate over all subscriptions is larger than the send rate. Le nombre d’expéditeurs est faible.The number of senders is small. Le nombre de récepteurs par abonnement est faible.The number of receivers per subscription is small.

Pour maximiser le débit, procédez comme suit :To maximize throughput, do the following:

  • Pour augmenter la vitesse de transmission globale dans la rubrique, utilisez plusieurs structures de messages pour créer des expéditeurs.To increase the overall send rate into the topic, use multiple message factories to create senders. Pour chaque expéditeur, utilisez des opérations asynchrones ou plusieurs threads.For each sender, use asynchronous operations or multiple threads.
  • Pour augmenter la vitesse de réception d’ensemble d’un abonnement, utilisez plusieurs structures de message pour créer des destinataires.To increase the overall receive rate from a subscription, use multiple message factories to create receivers. Pour chaque destinataire, utilisez des opérations asynchrones ou plusieurs threads.For each receiver, use asynchronous operations or multiple threads.
  • Utilisez des opérations asynchrones pour tirer parti du traitement par lot côté client.Use asynchronous operations to take advantage of client-side batching.
  • Utilisez la valeur par défaut de l’intervalle de 20 ms pour réduire le nombre de transmissions de protocole client Service Bus.Use the default batching interval of 20 ms to reduce the number of Service Bus client protocol transmissions.
  • Désactivez l’accès au magasin par lot.Leave batched store access enabled. Cet accès augmente la cadence à laquelle les messages peuvent être écrits dans la rubrique.This access increases the overall rate at which messages can be written into the topic.
  • Définissez le nombre de lectures anticipées à 20 fois la vitesse de traitement maximale de la totalité des destinataires d’une structure.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Cela réduit le nombre de transmissions de protocole client Service Bus.This count reduces the number of Service Bus client protocol transmissions.
  • Utilisez une rubrique partitionnée pour améliorer les performances et la disponibilité.Use a partitioned topic for improved performance and availability.

Rubrique comportant un grand nombre d’abonnementsTopic with a large number of subscriptions

Objectif : Maximiser le débit d’une rubrique comportant un grand nombre d’abonnements.Goal: Maximize the throughput of a topic with a large number of subscriptions. Un message est reçu par un grand nombre d’abonnements, ce qui signifie que la vitesse de réception associée à l’ensemble des abonnements est supérieure à la vitesse d’envoi.A message is received by many subscriptions, which means the combined receive rate over all subscriptions is much larger than the send rate. Le nombre d’expéditeurs est faible.The number of senders is small. Le nombre de récepteurs par abonnement est faible.The number of receivers per subscription is small.

Les rubriques comportant un grand nombre d’abonnements affichent généralement un faible débit global si tous les messages sont acheminés vers tous les abonnements.Topics with a large number of subscriptions typically expose a low overall throughput if all messages are routed to all subscriptions. Ce faible débit est dû au fait que chaque message est reçu plusieurs fois, et que tous les messages contenus dans une rubrique et tous les abonnements associés sont stockés dans le même magasin.This low throughput 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. Il est supposé que le nombre d’expéditeurs et nombre de récepteurs par abonnement est faible.It is assumed that the number of senders and number of receivers per subscription is small. Service Bus prend en charge jusqu’à 2 000 abonnements par rubrique.Service Bus supports up to 2,000 subscriptions per topic.

Pour maximiser le débit, procédez comme suit :To maximize throughput, try the following steps:

  • Utilisez des opérations asynchrones pour tirer parti du traitement par lot côté client.Use asynchronous operations to take advantage of client-side batching.
  • Utilisez la valeur par défaut de l’intervalle de 20 ms pour réduire le nombre de transmissions de protocole client Service Bus.Use the default batching interval of 20 ms to reduce the number of Service Bus client protocol transmissions.
  • Désactivez l’accès au magasin par lot.Leave batched store access enabled. Cet accès augmente la cadence à laquelle les messages peuvent être écrits dans la rubrique.This access increases the overall rate at which messages can be written into the topic.
  • Définissez le nombre de lectures anticipées à 20 fois la vitesse de réception prévue en secondes.Set the prefetch count to 20 times the expected receive rate in seconds. Cela réduit le nombre de transmissions de protocole client Service Bus.This count reduces the number of Service Bus client protocol transmissions.
  • Utilisez une rubrique partitionnée pour améliorer les performances et la disponibilité.Use a partitioned topic for improved performance and availability.

Étapes suivantesNext steps

Pour en savoir plus sur l’optimisation des performances Service Bus, consultez Entités de messagerie partitionnées.To learn more about optimizing Service Bus performance, see Partitioned messaging entities.