Выбираем 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 на результаты теста, все тестовые сообщения были инициализированы с помощью байтового массива соответствующего объема и случайных значений.