Выбираем Windows Azure: планирование объемов для сервисов Windows Azure Service Bus

В этом материале описываются следующие темы:

  • Описание существенных различий между максимальными размерами очередей Windows Azure и очередей и тем шины обслуживания Windows Azure.
  • Методика приблизительного расчета объема очередей шины обслуживания для использования преимуществ функций очередей и тем шины обслуживания.
  • Описание теста для обработки сообщений различного объема; тест дает представление о том, сколько сообщений конкретного объема помещается в очереди или теме шины обслуживания.

Максимальные размеры очередей и тем шины обслуживания Windows Azure

Очереди Windows Azure, так же как и очереди шины обслуживания, обеспечивают доступ к хранилищу на основе очередей. Различные наборы функций позволяют выбрать ту или иную очередь в зависимости от потребностей конкретного приложения. Например, шина обслуживания имеет темы и подписки. Такая реализация парадигмы «публикация и подписка» часто используется в бизнес-сценариях рассылки уведомлений. С другой стороны, в очередях Windows Azure может храниться до 100 терабайтов данных, в то время как вместимость очередей шины обслуживания в настоящее время ограничена пятью гигабайтами.

Ниже описаны два основных различия: максимальный размер сообщения и максимальный размер очереди.

Сравнение

Очереди Windows Azure

Очереди шины обслуживания

Максимальный размер сообщения

64 КБ

Примечание. С учетом служебных данных в кодировке base64, занимающих около 25 % объема сообщения.

256 КБ

Примечание. С учетом заголовков и текстового поля сообщения. Максимальный размер заголовка — 64 КБ.

Максимальный размер очереди

100 ТБ

Примечание. Максимальный размер ограничивается на уровне учетной записи хранения.

1, 2, 3, 4 или 5 ГБ

Размер задается при создании очереди или темы.

Последнее различие (ограничение размера до 5 ГБ для очередей и тем шины обслуживания и лимит в 100 ТБ для очередей Windows Azure) может оказаться существенным. Если вы хотите использовать такие функции шины обслуживания, как темы и подписки, учет недоставленных сообщений, правила или действия, нужно заранее рассчитать объем очереди или темы шины обслуживания, необходимый для создания конкретного приложения и его надежной работы. Для очень активного приложения не составит труда создать очередь или тему с 5 ГБ данных, в зависимости от размера сообщений, размера заголовков сообщений и размера настраиваемых элементов сообщений, а также скорости, с которой эти сообщения помещаются в очередь или отправляются в тему.

Еще одно отличие очередей шины обслуживания заключается в том, что размер очереди задается при ее создании. Изменить размер очереди после ее создания нельзя; в то же время очередям Windows Azure доступен такой большой объем хранения, что потребности увеличить размер очереди Windows Azure почти никогда не возникает.

Если заданный объем очереди или темы превышен, в ответ на последующие запросы о помещении сообщения в очередь будет выдаваться исключение Microsoft.ServiceBus.Messaging.QuotaExceededException (Microsoft. Шина обслуживания. Сообщения. Исключение: нет свободного места). В приложении должен быть предусмотрен механизм обработки исключений этого типа. Например, можно временно приостановить доставку сообщений в очередь или тему, чтобы клиенты успели обработать очередь накопившихся сообщений до того, как возобновится публикация новых.

Важно помнить, что сообщения в очередях шины обслуживания состоят из двух частей: заголовка и текстового поля. Общий размер сообщения (заголовок и текстовое поле) не должен превышать 256 КБ. API шины обслуживания, предназначенный для обмена сообщениями через посредника, использует двоичную сериализацию XML (не текстовый XML). Это сокращает размер сериализованных полезных данных на выходе и позволяет хранить сообщения объемом чуть больше 256 КБ. Однако необходимо проверить, насколько сократится размер в вашем конкретном приложении.

Расчет объема очередей и тем шины обслуживания

Рассмотрим базовый алгоритм расчета размера сообщений и определим, какие очереди или темы шины обслуживания могут понадобиться для вашего приложения.

У пустого сообщения размер текстового поля по умолчанию составляет 1024 байт, а размер заголовка — 156 байт. Если учесть остальные элементы, то размер сообщения без настраиваемых заголовков или свойств и с пустым текстовым полем будет равен 1635 байтам.

Чтобы приблизительно рассчитать объем, необходимый для хранения определенного количества сообщений, можно использовать следующую формулу:

Количество сообщений * (размер текстового поля сообщения + размер заголовка сообщения)

Чтобы определить размер текстового поля, используйте свойство BrokeredMessage.Size (Сообщение, передаваемое через посредника. Размер). Вычислить размер заголовка сложнее: все зависит от того, насколько точный результат вам нужен. Чтобы наиболее точно определить размер заголовка, отправьте сообщение (или тестовое сообщение — если вам необходимо получить информацию перед отсылкой нескольких сообщений), а затем запросите метаданные очереди с помощью метода NamespaceManager.GetQueue (Диспетчер пространства имен. Извлечь очередь) или NamespaceManager.GetTopic (Диспетчер пространства имен. Извлечь тему). Используйте свойство SizeInBytes (Размер в байтах) для объектов QueueDescription (Описание очереди) или TopicDescription (Описание темы), чтобы оценить увеличение размера сообщения в результате добавления заголовка.

Для расчета объема темы используется другой алгоритм. Чтобы рассчитать, сколько места занимает в теме определенное количество сообщений, используйте следующую формулу:

Количество сообщений * (размер текстового поля сообщения + (размер заголовка сообщения * количество подписок))

Обратите внимание: размер заголовка умножается на количество подписок на данную тему. Это означает, что при добавлении настраиваемых заголовков к сообщениям темы ее размер увеличится в соответствии с количеством подписок.

Например, для сообщения с 200 подписками, с размером по умолчанию, размер темы составит 32 КБ. Однако, если увеличить размер заголовка до 600 байт, размер темы будет равен 120 КБ. Добавление сообщений ACK, поступающих от каждого получателя подписки, вызовет значительное увеличение размера темы. Возьмите сообщение с 200 подписками и заголовком объемом 600 байт, добавьте 200 сообщений ACK (по одному на каждую подписку), и вы получите результат 568 635 байт. Такие моменты важно продумывать заранее.

Проверка приблизительных расчетов объема

Выполняя приблизительный подсчет количества сообщений, помещающихся в одну очередь шины обслуживания, вы можете принять во внимание приведенные ниже данные. Они были собраны с помощью специальной сервисной программы для определения объемов очередей при использовании сообщений разных размеров.

Размер тестового сообщения

Очередь объемом 1 ГБ

Очередь объемом 2 ГБ

Очередь объемом 3 ГБ

Очередь объемом 4 ГБ

Очередь объемом 5 ГБ

1 КБ

1 041 790

2 059 920

3 128 550

4 186 400

5 238 750

10 КБ

102 996

208 358

312 537

416 716

520 895

50 КБ

20 857

41 792

62 507

83 343

104 179

100 КБ

10 466

20 836

31 254

41 672

52 090

250 КБ

4191

8334

12 501

16 669

20 836

Чтобы исключить влияние двоичной сериализации XML на результаты теста, все тестовые сообщения были инициализированы с помощью байтового массива соответствующего объема и случайных значений.