Рекомендации по повышению производительности с помощью обмена сообщениями через служебную шинуBest Practices for performance improvements using Service Bus Messaging

В этой статье описано использование служебной шины Azure для оптимизации производительности при обмене сообщениями через брокер.This article describes how to use Azure Service Bus to optimize performance when exchanging brokered messages. В первой части статьи рассматриваются различные механизмы, которые можно использовать для повышения производительности.The first part of this article describes the different mechanisms that are offered to help increase performance. Во второй части приведены инструкции по эффективному использованию служебной шины для достижения максимальной производительности при определенных условиях.The second part provides guidance on how to use Service Bus in a way that can offer the best performance in a given scenario.

В этой статье термин "клиент" означает любую сущность, которая обращается к служебной шине.Throughout this article, the term "client" refers to any entity that accesses Service Bus. Клиент может быть как отправителем, так и получателем.A client can take the role of a sender or a receiver. Термин "отправитель" используется для клиента очереди или раздела служебной шины, который отправляет сообщения в очередь или подписку на раздел.The term "sender" is used for a Service Bus queue or topic client that sends messages to a Service Bus queue or topic subscription. Термин "получатель" используется в отношении клиента очереди или подписки служебной шины, который получает сообщения из очереди или подписки.The term "receiver" refers to a Service Bus queue or subscription client that receives messages from a Service Bus queue or subscription.

В разделах ниже описывается ряд способов, которые используются служебной шиной для повышения производительности.These sections introduce several concepts that Service Bus uses to help boost performance.

ПротоколыProtocols

Служебная шина позволяет клиентам отправлять и получать сообщения с помощью трех протоколов.Service Bus enables clients to send and receive messages via one of three protocols:

  1. Протокол AMQPAdvanced Message Queuing Protocol (AMQP)
  2. Протокол SBMPService Bus Messaging Protocol (SBMP)
  3. HTTPHTTP

Протоколы AMQP и SBMP более эффективны, так как они поддерживают подключение к служебной шине, пока существует фабрика обмена сообщениями.AMQP and SBMP are more efficient, because they maintain the connection to Service Bus as long as the messaging factory exists. Он также реализует функции пакетной обработки и предварительной выборки.It also implements batching and prefetching. Если явно не указано иное, в этой статье предполагается использование протокола AMQP или SBMP.Unless explicitly mentioned, all content in this article assumes the use of AMQP or SBMP.

Повторное использование фабрик и клиентовReusing factories and clients

Клиентские объекты служебной шины, такие как QueueClient или MessageSender, создаются с помощью объекта MessagingFactory. Этот объект также обеспечивает внутреннее управление подключениями.Service Bus client objects, such as QueueClient or MessageSender, are created through a MessagingFactory object, which also provides internal management of connections. Закрывать фабрики обмена сообщениями или клиенты очередей, разделов и подписок после отправки сообщения, а затем повторно создавать их при отправке следующего сообщения не рекомендуется.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. При закрытии фабрики обмена сообщениями удаляется подключение к службе служебной шины, а при повторном создании фабрики устанавливается новое подключение.Closing a messaging factory deletes the connection to the Service Bus service, and a new connection is established when recreating the factory. Установка подключения является ресурсоемкой операцией, которую можно исключить, если повторно использовать одну и ту же фабрику и клиентские объекты для нескольких операций.Establishing a connection is an expensive operation that you can avoid by reusing the same factory and client objects for multiple operations. Вы можете безопасно использовать объекты клиента для параллельных асинхронных операций из нескольких потоков.You can safely use these client objects for concurrent asynchronous operations and from multiple threads.

Параллельные операцииConcurrent operations

Выполнение любой операции (отправка, получение, удаление и т. д.) занимает определенное время.Performing an operation (send, receive, delete, etc.) takes some time. В это время входит обработка операции службой Service Bus, а также задержка запроса и ответа.This time includes the processing of the operation by the Service Bus service in addition to the latency of the request and the reply. Чтобы увеличить количество операций в единицу времени, необходимо выполнять их параллельно.To increase the number of operations per time, operations must execute concurrently.

Клиент планирует параллельные операции за счет асинхронных операций.The client schedules concurrent operations by performing asynchronous operations. Следующий запрос запускается до завершения предыдущего запроса.The next request is started before the previous request is completed. Вот пример фрагмента кода асинхронной операции отправки: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");

Вот пример асинхронной операции получения.The following code is an example of an asynchronous receive operation. Полную программу см. здесь:See the full program here:

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

receiver.RegisterMessageHandler(...);

Режим полученияReceive mode

При создании клиента очереди или подписки вы можете выбрать режим получения: блокировка для просмотра или получение и удаление.When creating a queue or subscription client, you can specify a receive mode: Peek-lock or Receive and Delete. По умолчанию используется режим блокировки для просмотра.The default receive mode is PeekLock. В этом режиме клиент отправляет запрос на получение сообщения из служебной шины.When operating in this mode, the client sends a request to receive a message from Service Bus. После получения сообщения клиент отправляет запрос на завершение сообщения.After the client has received the message, it sends a request to complete the message.

Если установить режим получения и удаления, оба этих действия объединяются в один запрос.When setting the receive mode to ReceiveAndDelete, both steps are combined in a single request. В результате этих шагов уменьшается общее количество операций, что может повысить общую пропускную способность для сообщений.These steps reduce the overall number of operations, and can improve the overall message throughput. Однако такое повышение производительности сопряжено с риском потери сообщений.This performance gain comes at the risk of losing messages.

Служебная шина не поддерживает транзакции для операций получения и удаления.Service Bus does not support transactions for receive-and-delete operations. Кроме того, иногда требуется семантика блокировки для просмотра (например, если клиенту необходимо отложить сообщение или пометить его как недоставленное).In addition, peek-lock semantics are required for any scenarios in which the client wants to defer or dead-letter a message.

Пакетная обработка на стороне клиентаClient-side batching

Пакетная обработка на стороне клиента позволяет клиенту очереди или раздела задержать отправку сообщения на определенный период времени.Client-side batching enables a queue or topic client to delay the sending of a message for a certain period of time. Если в течение этого времени клиент будет отправлять дополнительные сообщения, они будут переданы в одном пакете.If the client sends additional messages during this time period, it transmits the messages in a single batch. Кроме того, пакетная обработка на стороне клиента очереди или подписки позволяет объединить несколько запросов на завершение в один.Client-side batching also causes a queue or subscription client to batch multiple Complete requests into a single request. Пакетная обработка возможна только для асинхронных операций отправки и завершения.Batching is only available for asynchronous Send and Complete operations. Синхронные операции отправляются в службу служебной шины незамедлительно.Synchronous operations are immediately sent to the Service Bus service. Пакетная обработка недоступна для операций просмотра или получения. Также пакетную обработку нельзя использовать для объединения операций нескольких клиентов.Batching does not occur for peek or receive operations, nor does batching occur across clients.

По умолчанию интервал пакетной обработки в клиенте составляет 20 мс.By default, a client uses a batch interval of 20 ms. Интервал пакетной обработки можно изменить с помощью свойства BatchFlushInterval, которое задается перед созданием фабрики обмена сообщениями.You can change the batch interval by setting the BatchFlushInterval property before creating the messaging factory. Этот параметр влияет на все клиенты, создаваемые этой фабрикой.This setting affects all clients that are created by this factory.

Чтобы отключить пакетную обработку, задайте для свойства BatchFlushInterval значение TimeSpan.Zero.To disable batching, set the BatchFlushInterval property to TimeSpan.Zero. Пример.For example:

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

Пакетная обработка не влияет на количество оплачиваемых операций обмена сообщениями и доступна только для протокола клиента служебной шины с использованием библиотеки 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. Протокол HTTP не поддерживает пакетную обработку.The HTTP protocol does not support batching.

Примечание

Установка BatchFlushInterval гарантирует, что Пакетная обработка будет неявной с точки зрения приложения.Setting BatchFlushInterval ensures that the batching is implicit from the application's perspective. т. е. приложение выполняет вызовы SendAsync () и Комплетеасинк () и не выполняет определенные пакетные вызовы.i.e. The application makes SendAsync() and CompleteAsync() calls and does not make specific Batch calls.

Явная Пакетная обработка на стороне клиента может быть реализована с использованием приведенного ниже вызова метода.Explicit client side batching can be implemented by utilizing the below method call -

Task SendBatchAsync (IEnumerable<BrokeredMessage> messages);

Здесь общий размер сообщений должен быть меньше, чем максимальный размер, поддерживаемый ценовой категорией.Here the combined size of the messages must be less than the maximum size supported by the pricing tier.

Пакетный доступ к хранилищуBatching store access

Чтобы увеличить пропускную способность очереди, раздела или подписки, служебная шина объединяет несколько сообщений в пакеты, когда записывает их в свое внутреннее хранилище.To increase the throughput of a queue, topic, or subscription, Service Bus batches multiple messages when it writes to its internal store. Если эта функция включена для очереди или раздела, сообщения записываются в хранилище в пакетном режиме.If enabled on a queue or topic, writing messages into the store will be batched. Если эта функция включена для очереди или подписки, сообщения будут удаляться из хранилища в пакетном режиме.If enabled on a queue or subscription, deleting messages from the store will be batched. Если пакетный доступ к хранилищу включен для сущности, служебная шина будет задерживать операцию записи для этой сущности на период до 20 мс.If batched store access is enabled for an entity, Service Bus delays a store write operation regarding that entity by up to 20 ms.

Примечание

При пакетной обработке нет опасности потерять сообщения, даже если по истечении 20 мс такой обработки происходит сбой службы "Служебная шина".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.

Последующие операции с хранилищем, выполняемые в течение этого периода, добавляются в пакет.Additional store operations that occur during this interval are added to the batch. Пакетный доступ к хранилищу влияет только на операции отправки и завершения. Операции получения не затрагиваются.Batched store access only affects Send and Complete operations; receive operations are not affected. Пакетный доступ к хранилищу является свойством сущности.Batched store access is a property on an entity. Пакетная обработка применяется ко всем сущностям, для которых включен пакетный доступ к хранилищу.Batching occurs across all entities that enable batched store access.

При создании новой очереди, раздела или подписки пакетный доступ к хранилищу включен по умолчанию.When creating a new queue, topic or subscription, batched store access is enabled by default. Чтобы отключить пакетный доступ к хранилищу, задайте для свойства EnableBatchedOperations значение false перед созданием сущности.To disable batched store access, set the EnableBatchedOperations property to false before creating the entity. Пример.For example:

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

Пакетный доступ к хранилищу не влияет на количество оплачиваемых операций обмена сообщениями и является свойством очереди, раздела или подписки.Batched store access does not affect the number of billable messaging operations, and is a property of a queue, topic, or subscription. Он не зависит от режима получения и протокола, используемого для подключения между клиентом и службой служебной шины.It is independent of the receive mode and the protocol that is used between a client and the Service Bus service.

Предварительная выборкаPrefetching

Предварительная выборка позволяет клиенту очереди или подписки загружать из службы дополнительные сообщения при выполнении операции получения.Prefetching enables the queue or subscription client to load additional messages from the service when it performs a receive operation. Клиент сохраняет эти сообщения в локальном кэше.The client stores these messages in a local cache. Размер кэша определяется свойствами QueueClient.PrefetchCount и SubscriptionClient.PrefetchCount.The size of the cache is determined by the QueueClient.PrefetchCount or SubscriptionClient.PrefetchCount properties. В каждом клиенте с включенной предварительной выборкой создается собственный кэш.Each client that enables prefetching maintains its own cache. Кэш не может использоваться одновременно несколькими клиентами.A cache is not shared across clients. Если клиент инициирует операцию получения и его кэш пуст, служба передает пакет сообщений.If the client initiates a receive operation and its cache is empty, the service transmits a batch of messages. Размер пакета равен размеру кэша или 256 КБ (в зависимости от того, какое значение меньше).The size of the batch equals the size of the cache or 256 KB, whichever is smaller. Если клиент инициирует операцию получения и в кэше имеется сообщение, это сообщение извлекается из кэша.If the client initiates a receive operation and the cache contains a message, the message is taken from the cache.

При использовании предварительной выборки сообщений служба блокирует выбранное сообщение.When a message is prefetched, the service locks the prefetched message. В результате блокировки это сообщение не может быть получено другим получателем.With the lock, the prefetched message cannot be received by a different receiver. Если получатель не может завершить сообщение до истечения периода блокировки, сообщение станет доступным другим получателям.If the receiver cannot complete the message before the lock expires, the message becomes available to other receivers. Копия предварительно выбранного сообщения остается в кэше.The prefetched copy of the message remains in the cache. Если получатель обратится к кэшированной копии, срок действия которой истек, то при попытке завершить это сообщение будет создано исключение.The receiver that consumes the expired cached copy will receive an exception when it tries to complete that message. По умолчанию период блокировки сообщения составляет 60 секунд.By default, the message lock expires after 60 seconds. Это значение можно увеличить до 5 минут.This value can be extended to 5 minutes. Во избежание использования сообщений с истекшим сроком действия размер кэша всегда должен быть меньше, чем количество сообщений, которые могут быть использованы клиентом в течение периода блокировки.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.

При использовании срока действия блокировки по умолчанию (60 секунд) хорошее значение для PrefetchCount составляет 20 раз больше, чем максимальная скорость обработки всех получателей фабрики.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. Например, фабрика создает трех получателей, каждый из которых может обработать до 10 сообщений в секунду.For example, a factory creates three receivers, and each receiver can process up to 10 messages per second. Число объектов предварительной выборки не должно превышать 20 х 3 х 10 = 600.The prefetch count should not exceed 20 X 3 X 10 = 600. По умолчанию PrefetchCount имеет значение 0, что означает, что дополнительные сообщения из службы не извлекаться.By default, PrefetchCount is set to 0, which means that no additional messages are fetched from the service.

Предварительная выборка сообщений увеличивает совокупную пропускную способность очереди или подписки, так как уменьшает общее количество операций с сообщениями (так называемых круговых путей).Prefetching messages increases the overall throughput for a queue or subscription because it reduces the overall number of message operations, or round trips. Тем не менее предварительная выборка первого сообщения займет больше времени (из-за увеличенного размера сообщения).Fetching the first message, however, will take longer (due to the increased message size). Получение предварительно выбранных сообщений будет выполняться быстрее, так как эти сообщения уже загружены клиентом.Receiving prefetched messages will be faster because these messages have already been downloaded by the 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. При получении сообщения клиент не проверяет свойство срока жизни сообщения.The client does not check the message’s TTL property when the message is received. Сообщение может быть получено клиентом во время кэширования, даже если срок жизни сообщения истек.Instead, the message can be received even if the message’s TTL has passed while the message was cached by the client.

Предварительная выборка не влияет на количество оплачиваемых операций обмена сообщениями и доступна только для протокола клиента служебной шины.Prefetching does not affect the number of billable messaging operations, and is available only for the Service Bus client protocol. Протокол HTTP не поддерживает предварительную выборку.The HTTP protocol does not support prefetching. Предварительная выборка доступна как для синхронных, так и для асинхронных операций получения.Prefetching is available for both synchronous and asynchronous receive operations.

Упреждающая выборка и РецеивебатчPrefetching and ReceiveBatch

Хотя основные понятия, связанные с выборке нескольких сообщений, имеют схожую семантику для обработки сообщений в пакете (Рецеивебатч), существуют некоторые небольшие отличия, которые следует учитывать при использовании этих компонентов вместе.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.

Предварительная выборка — это конфигурация (или режим) на клиенте (QueueClient и SubscriptionClient), а Рецеивебатч — операция (с семантикой запросов-ответов).Prefetch is a configuration (or mode) on the client (QueueClient and SubscriptionClient) and ReceiveBatch is an operation (that has request-response semantics).

При совместном использовании следует учитывать следующие случаи.While using these together, consider the following cases -

  • Предвыборка должна быть больше или равна количеству сообщений, которые вы ожидаете получать от Рецеивебатч.Prefetch should be greater than or equal to the number of messages you are expecting to receive from ReceiveBatch.
  • При выборке может быть не более n/3 раз больше количества сообщений, обрабатываемых в секунду, где n — продолжительность блокировки по умолчанию.Prefetch can be up to n/3 times the number of messages processed per second, where n is the default lock duration.

Существуют некоторые трудности с беспроблемным подходом (т. е. поддержание счетчика предварительной выборки очень высоким), так как это означает, что сообщение заблокировано определенным получателем.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. Рекомендуется испробовать значения предварительного выборки между пороговыми значениями, упомянутыми выше, и определить, что помещается.The recommendation is to try out prefetch values between the thresholds mentioned above and empirically identify what fits.

Несколько очередейMultiple queues

Если ожидаемая нагрузка не может обрабатываться одной очередью или разделом, необходимо использовать несколько сущностей обмена сообщениями.If the expected load cannot be handled by a single queue or topic, you must use multiple messaging entities. При использовании нескольких сущностей создайте выделенный клиент для каждой сущности. Не используйте один клиент для всех сущностей.When using multiple entities, create a dedicated client for each entity, instead of using the same client for all entities.

Возможности для разработки и тестированияDevelopment and testing features

В служебной шине доступна одна функция, используемая специально для разработки, которую никогда не следует использовать в рабочих конфигурациях: TopicDescription.EnableFilteringMessagesBeforePublishing.Service Bus has one feature, used specifically for development, which should never be used in production configurations: TopicDescription.EnableFilteringMessagesBeforePublishing.

При добавлении новых правил или фильтров в раздел вы можете использовать функцию TopicDescription.EnableFilteringMessagesBeforePublishing, чтобы проверить правильность работы выражения нового фильтра.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.

СценарииScenarios

Далее описываются стандартные сценарии обмена сообщениями и приводятся рекомендации по настройкам служебной шины.The following sections describe typical messaging scenarios and outline the preferred Service Bus settings. Пропускная способность бывает небольшой (менее 1 сообщения в секунду), средней (1 сообщение в секунду или больше, но не более 100 сообщений в секунду) и высокой (100 сообщений в секунду или больше).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). Количество клиентов бывает небольшим (5 и меньше), средним (более 5, но не более 20) и большим (более 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).

Очередь с высокой пропускной способностьюHigh-throughput queue

Цель: максимально повысить пропускную способность одной очереди.Goal: Maximize the throughput of a single queue. Количество отправителей и получателей: небольшое.The number of senders and receivers is small.

  • Чтобы увеличить общую скорость отправки сообщений в очередь, используйте несколько фабрик обмена сообщениями для создания отправителей.To increase the overall send rate into the queue, use multiple message factories to create senders. Для каждого отправителя используйте асинхронные операции или разделение на потоки.For each sender, use asynchronous operations or multiple threads.
  • Чтобы увеличить общую скорость получения сообщений из очереди, используйте несколько фабрик обмена сообщениями для создания получателей.To increase the overall receive rate from the queue, use multiple message factories to create receivers.
  • Используйте асинхронные операции, чтобы воспользоваться преимуществами пакетной обработки на стороне клиента.Use asynchronous operations to take advantage of client-side batching.
  • Установите интервал пакетной обработки на 50 мс, чтобы уменьшить число передач по протоколу клиента служебной шины.Set the batching interval to 50 ms to reduce the number of Service Bus client protocol transmissions. Если используется несколько отправителей, увеличьте интервал пакетной обработки до 100 мс.If multiple senders are used, increase the batching interval to 100 ms.
  • Не отключайте пакетный доступ к хранилищу.Leave batched store access enabled. Этот доступ повысит общую скорость записи сообщений в очередь.This access increases the overall rate at which messages can be written into the queue.
  • Для количества элементов предварительной выборки установите значение, в 20 раз превышающее максимальную скорость обработки всех получателей фабрики.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Это снизит число передач по протоколу клиента служебной шины.This count reduces the number of Service Bus client protocol transmissions.

Несколько очередей с высокой пропускной способностьюMultiple high-throughput queues

Цель: максимально повысить общую пропускную способность нескольких очередей.Goal: Maximize overall throughput of multiple queues. Пропускная способность одной очереди: средняя или высокая.The throughput of an individual queue is moderate or high.

Чтобы максимально повысить пропускную способность нескольких очередей, примените настройки, максимально повышающие пропускную способность одной очереди.To obtain maximum throughput across multiple queues, use the settings outlined to maximize the throughput of a single queue. Кроме того, используйте несколько фабрик для создания клиентов, которые отправляют или получают сообщения из разных очередей.In addition, use different factories to create clients that send or receive from different queues.

Очередь с небольшой задержкойLow latency queue

Цель: минимизировать совокупное время задержки в очереди или разделе.Goal: Minimize end-to-end latency of a queue or topic. Количество отправителей и получателей: небольшое.The number of senders and receivers is small. Пропускная способность очереди: низкая или средняя.The throughput of the queue is small or moderate.

  • Отключите пакетную обработку на стороне клиента.Disable client-side batching. Клиент будет немедленно отправлять сообщения.The client immediately sends a message.
  • Отключите пакетный доступ к хранилищу.Disable batched store access. Служба будет немедленно записывать сообщения в хранилище.The service immediately writes the message to the store.
  • При использовании одного клиента измените количество элементов предварительной выборки на значение, в 20 раз превышающее скорость обработки получателя.If using a single client, set the prefetch count to 20 times the processing rate of the receiver. Если в очередь одновременно поступает несколько сообщений, протокол клиента служебной шины передаст их все одновременно.If multiple messages arrive at the queue at the same time, the Service Bus client protocol transmits them all at the same time. Когда клиент получит следующее сообщение, оно уже будет в локальном кэше.When the client receives the next message, that message is already in the local cache. Размер кэша должен быть небольшим.The cache should be small.
  • При использовании нескольких клиентов установите количество элементов предварительной выборки на 0.If using multiple clients, set the prefetch count to 0. В результате этого второй клиент сможет получить второе сообщение, пока первый клиент будет обрабатывать первое сообщение.By setting the count, the second client can receive the second message while the first client is still processing the first message.

Очередь с большим числом отправителейQueue with a large number of senders

Цель: максимально повысить пропускную способность очереди или раздела с большим количеством отправителей.Goal: Maximize throughput of a queue or topic with a large number of senders. Каждый отправитель отправляет сообщения со средней скоростью.Each sender sends messages with a moderate rate. Количество получателей: небольшое.The number of receivers is small.

В служебной шине можно открыть до 1000 параллельных подключений к сущности обмена сообщениями (или до 5000 при использовании протокола AMQP).Service Bus enables up to 1000 concurrent connections to a messaging entity (or 5000 using AMQP). Это ограничение установлено на уровне пространства имен. Очереди, разделы и подписки ограничены максимальным числом параллельных подключений для соответствующего пространства имен.This limit is enforced at the namespace level, and queues/topics/subscriptions are capped by the limit of concurrent connections per namespace. В случае очередей это значение распределяется между отправителями и получателями.For queues, this number is shared between senders and receivers. Если отправителям требуются все 1000 подключений, замените очередь одним разделом и одной подпиской.If all 1000 connections are required for senders, replace the queue with a topic and a single subscription. Раздел допускает до 1000 параллельных подключений от отправителей, тогда как подписка допускает 1000 дополнительных параллельных подключений от получателей.A topic accepts up to 1000 concurrent connections from senders, whereas the subscription accepts an additional 1000 concurrent connections from receivers. Если количество параллельных отправителей превышает 1000, то они должны отправлять сообщения на протокол служебной шины по протоколу HTTP.If more than 1000 concurrent senders are required, the senders should send messages to the Service Bus protocol via HTTP.

Чтобы максимально повысить пропускную способность, выполните следующие шаги:To maximize throughput, perform the following steps:

  • Если каждый отправитель размещается в отдельном процессе, используйте одну фабрику для этого процесса.If each sender resides in a different process, use only a single factory per process.
  • Используйте асинхронные операции, чтобы воспользоваться преимуществами пакетной обработки на стороне клиента.Use asynchronous operations to take advantage of client-side batching.
  • Установите интервал пакетной обработки на 20 мс, чтобы уменьшить число передач по протоколу клиента служебной шины.Use the default batching interval of 20 ms to reduce the number of Service Bus client protocol transmissions.
  • Не отключайте пакетный доступ к хранилищу.Leave batched store access enabled. Этот доступ повысит общую скорость записи сообщений в очередь или раздел.This access increases the overall rate at which messages can be written into the queue or topic.
  • Для количества элементов предварительной выборки установите значение, в 20 раз превышающее максимальную скорость обработки всех получателей фабрики.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Это снизит число передач по протоколу клиента служебной шины.This count reduces the number of Service Bus client protocol transmissions.

Очередь с большим числом получателейQueue with a large number of receivers

Цель: максимально повысить скорость получения в очереди или подписке с большим количеством получателей.Goal: Maximize the receive rate of a queue or subscription with a large number of receivers. Каждый получатель получает сообщения со средней скоростью.Each receiver receives messages at a moderate rate. Количество отправителей: небольшое.The number of senders is small.

В служебной шине можно открыть до 1000 параллельных подключений к сущности.Service Bus enables up to 1000 concurrent connections to an entity. Если для очереди требуется более 1000 получателей, замените очередь одним разделом и несколькими подписками.If a queue requires more than 1000 receivers, replace the queue with a topic and multiple subscriptions. Каждая подписка поддерживает до 1000 параллельных подключений.Each subscription can support up to 1000 concurrent connections. Кроме того, получатели могут обращаться к очереди через протокол HTTP.Alternatively, receivers can access the queue via the HTTP protocol.

Чтобы максимально повысить пропускную способность, выполните следующие действия.To maximize throughput, do the following:

  • Если каждый получатель размещается в отдельном процессе, используйте одну фабрику для этого процесса.If each receiver resides in a different process, use only a single factory per process.
  • Получатели могут использовать синхронные и асинхронные операции.Receivers can use synchronous or asynchronous operations. Учитывая среднюю скорость получения отдельного получателя, пакетная обработка на стороне клиента в отношении запросов на завершение не повлияет на пропускную способность получателя.Given the moderate receive rate of an individual receiver, client-side batching of a Complete request does not affect receiver throughput.
  • Не отключайте пакетный доступ к хранилищу.Leave batched store access enabled. Это снизит общую нагрузку на сущность.This access reduces the overall load of the entity. Кроме того, это понизит общую скорость записи сообщений в очередь или раздел.It also reduces the overall rate at which messages can be written into the queue or topic.
  • Для количества элементов предварительной выборки установите небольшое значение (например, PrefetchCount = 10).Set the prefetch count to a small value (for example, PrefetchCount = 10). Это позволит избежать ситуации, когда одни получатели простаивают, а другие получают множество кэшированных сообщений.This count prevents receivers from being idle while other receivers have large numbers of messages cached.

Раздел с небольшим количеством подписокTopic with a small number of subscriptions

Цель: максимально повысить пропускную способность раздела с небольшим количеством подписок.Goal: Maximize the throughput of a topic with a small number of subscriptions. Сообщение получается несколькими подписками. Это означает, что общая скорость получения во всех подписках будет больше, чем скорость отправки.A message is received by many subscriptions, which means the combined receive rate over all subscriptions is larger than the send rate. Количество отправителей: небольшое.The number of senders is small. Получателей в каждой подписке так же немного.The number of receivers per subscription is small.

Чтобы максимально повысить пропускную способность, выполните следующие действия.To maximize throughput, do the following:

  • Чтобы увеличить общую скорость отправки сообщений в раздел, используйте несколько фабрик обмена сообщениями для создания отправителей.To increase the overall send rate into the topic, use multiple message factories to create senders. Для каждого отправителя используйте асинхронные операции или разделение на потоки.For each sender, use asynchronous operations or multiple threads.
  • Чтобы увеличить общую скорость получения сообщений из подписки, используйте несколько фабрик обмена сообщениями для создания получателей.To increase the overall receive rate from a subscription, use multiple message factories to create receivers. Для каждого получателя используйте асинхронные операции или разделение на потоки.For each receiver, use asynchronous operations or multiple threads.
  • Используйте асинхронные операции, чтобы воспользоваться преимуществами пакетной обработки на стороне клиента.Use asynchronous operations to take advantage of client-side batching.
  • Установите интервал пакетной обработки на 20 мс, чтобы уменьшить число передач по протоколу клиента служебной шины.Use the default batching interval of 20 ms to reduce the number of Service Bus client protocol transmissions.
  • Не отключайте пакетный доступ к хранилищу.Leave batched store access enabled. Это повысит общую скорость записи сообщений в раздел.This access increases the overall rate at which messages can be written into the topic.
  • Для количества элементов предварительной выборки установите значение, в 20 раз превышающее максимальную скорость обработки всех получателей фабрики.Set the prefetch count to 20 times the maximum processing rates of all receivers of a factory. Это снизит число передач по протоколу клиента служебной шины.This count reduces the number of Service Bus client protocol transmissions.

Раздел с большим количеством подписокTopic with a large number of subscriptions

Цель: максимально повысить пропускную способность раздела с большим количеством подписок.Goal: Maximize the throughput of a topic with a large number of subscriptions. Сообщение направляется нескольким подпискам. Это означает, что общая скорость получения во всех подписках будет значительно больше, чем скорость отправки.A message is received by many subscriptions, which means the combined receive rate over all subscriptions is much larger than the send rate. Количество отправителей: небольшое.The number of senders is small. Получателей в каждой подписке так же немного.The number of receivers per subscription is small.

Разделы с большим количеством подписок обычно обеспечивают низкую общую пропускную способность, если все сообщения направляются во все подписки.Topics with a large number of subscriptions typically expose a low overall throughput if all messages are routed to all subscriptions. Низкая пропускная способность связана с тем, что получение каждого сообщения выполняется много раз, а все содержащиеся в разделе сообщения и все подписки раздела хранятся в одном хранилище.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. Предполагается, что количество отправителей и получателей в каждой подписке небольшое.It is assumed that the number of senders and number of receivers per subscription is small. Служебная шина поддерживает до 2000 подписок на раздел.Service Bus supports up to 2,000 subscriptions per topic.

Чтобы максимально повысить пропускную способность, попробуйте выполнить следующие шаги:To maximize throughput, try the following steps:

  • Используйте асинхронные операции, чтобы воспользоваться преимуществами пакетной обработки на стороне клиента.Use asynchronous operations to take advantage of client-side batching.
  • Установите интервал пакетной обработки на 20 мс, чтобы уменьшить число передач по протоколу клиента служебной шины.Use the default batching interval of 20 ms to reduce the number of Service Bus client protocol transmissions.
  • Не отключайте пакетный доступ к хранилищу.Leave batched store access enabled. Это повысит общую скорость записи сообщений в раздел.This access increases the overall rate at which messages can be written into the topic.
  • Для количества элементов предварительной выборки установите значение, в 20 раз превышающее ожидаемую скорость получения в секундах.Set the prefetch count to 20 times the expected receive rate in seconds. Это снизит число передач по протоколу клиента служебной шины.This count reduces the number of Service Bus client protocol transmissions.