Знакомство с Yandex Message Queue
Кратко:
- Очереди в Yandex Message Queue состоят из тела и метаданных сообщения.
- Тело обрабатывается приложением, метаданные используются для подтверждения обработки, оценки времени и проверки передачи сообщения.
- Сервис YMQ организует очередь между отправителями и получателями сообщений.
- Существуют стандартные и FIFO очереди, отличающиеся порядком обработки и гарантией доставки сообщений.
- Параметры очередей включают стандартный таймаут видимости, срок хранения сообщений, максимальный размер сообщения и задержку доставки.
- Dead Letter Queue используется для обработки недоставленных сообщений.
- Работа с очередями осуществляется через API или AWS CLI.
- Тарификация зависит от типа очереди и исходящего трафика.
Знакомство с Yandex Message Queue
На прошлом уроке вы узнали, что такое очереди и зачем они нужны. На этом уроке вы разберётесь со спецификой реализации очередей в Yandex Message Queue и их параметрами.
Что такое сообщение
Основным понятием для очередей в Yandex Message Queue (YMQ) является сообщение. Сообщение состоит из тела — ваших данных — и метаданных, его дополнительных атрибутов.
Тело сообщения обрабатывается вашим приложением, а метаданные удобно использовать для других самых разнообразных целей: например, для подтверждения обработки сообщения, оценки времени его обработки или чтобы удостовериться, что оно было передано без изменений.

Представим, что мы считали это простое сообщение из очереди, давайте рассмотрим его содержимое:
Body
— т. е. тело сообщения. Здесь хранится то, что собственно передаётся.Attributes
— набор атрибутов сообщения, указывающих время первого получения (время UNIX), количество попыток обработки этого сообщения, время отправки (время UNIX).ReceiptHandle
— идентификатор получения. Он указывает на факт получения сообщения и назначается системой при его считывании. Этот идентификатор используется для удаления полученного сообщения из очереди или изменения его таймаута видимости.MD5OfBody
— хеш-сумма тела сообщения, созданная 128-битным алгоритмом хеширования MD5.MessageId
— уникальный идентификатор сообщения. Он возвращается вам из YMQ, когда вы отправляете сообщение. Этот идентификатор удобно использовать для различной диагностики.
Как работает сервис YMQ
Задача YMQ — организовать очередь между приложениями-отправителями и приложениями получателями сообщений. Чтобы отправить и получить сообщение, отправители и получатели должны обращаться к сервису сами.
Каждое сообщение за время жизни проходит следующие этапы:
- отправка в очередь;
- хранение в очереди, пока оно не будет считано или пока не истечёт время хранения;
- чтение сообщения потребителем и пометка сообщения на это время, как находящегося в обработке;
- удаление из очереди, если сообщение было успешно обработано или перенесено в Dead Letter Queue:

Типы очередей в YMQ
Сервис YMQ поддерживает два типа очередей — стандартные и FIFO. На предыдущем уроке мы уже разобрали их основные отличия. Давайте остановимся теперь на них подробнее.
Стандартные очереди позволяют сохранять сообщения, которые затем читаются приложениями в произвольном порядке. Такой подход упрощает систему обработки сообщений. Приложения должны быть рассчитаны на ситуации приёма данных не в хронологическом порядке их поступления.
Стандартные очереди обеспечивают гарантию, что каждое сообщение будет доставлено до получателя хотя бы один раз. В исключительных случаях данные могут быть доставлены до считывающего приложения несколько раз. Обрабатывающие системы должны быть готовы к подобным ситуациям. Такие очереди лучше подходят для обработки не связанных между собой сообщений и обеспечивают более высокую пропускную способность, то есть работают быстрее.
Очереди FIFO позволяют обеспечить строгую очерёдность выдачи сообщений запрашивающей/обрабатывающей стороне и обеспечивают семантику строгой однократной гарантированной доставки сообщений. Такие очереди подходят для передачи связанных сообщений и работают медленнее из-за того, что сообщения должны быть обработаны по очереди.
FIFO очереди часто используются для обработки финансовых данных. Представьте, что в одну FIFO очередь отправляются действия с банковскими счетами разных пользователей. Данные из очереди обрабатывают несколько получателей, и было бы удобно, чтобы все действия одного пользователя попадали одному получателю. Для такой цели можно использовать группировку сообщений.
При помощи специальных идентификаторов группы можно обеспечить отправку сразу нескольких потоков упорядоченных сообщений для разных получателей сообщений в рамках одной очереди FIFO. Вместо одной очереди FIFO получается несколько очередей по количеству групп. В каждой группе запись сообщений и их считывание происходит по схеме FIFO.
Параметры очередей
Давайте разберём, какие параметры бывают у очередей в Yandex Message Queue.

В Базовых параметрах помимо имени и типа очереди вы можете указать:
- Стандартный таймаут видимости. Это время, на которое сообщение скрывается из очереди после чтения получателем. Пока сообщение скрыто, другие получатели не могут получить сообщение из очереди. Минимальный таймаут видимости — 30 секунд, максимальный — 12 часов.
- Срок хранения сообщений. Вы можете указать, как долго каждое сообщение может храниться в очереди в ожидании чтения получателем. Это значение должно быть в промежутке от 60 секунд до 14 дней.
- Максимальный размер сообщения. Может составлять от 1 до 256 КБ.
- Задержка доставки. Иногда нужно, чтобы обработчик получил сообщение не сразу, а позже. Здесь вы можете указать время, в течение которого новое сообщение нельзя получить из очереди. Значение должно быть в промежутке от 0 секунд до 15 минут.
- Время ожидания при получении сообщения. В течение этого времени получатель будет ожидать поступления сообщений. Если в очереди появятся сообщения, вызов будет сделан раньше, чем указано в этой настройке. Если же по истечении этого времени сообщения не появились, будет возвращен пустой список.

В блоке Настройки очередей недоставленных сообщений вы можете настроить работу с так называемой Dead Letter Queue (DLQ, дословно — очередь невостребованных писем). Это специальная очередь, куда могут перенаправляться сообщения, которые получатели не смогли обработать в обычных очередях. Собирая такие сообщения в отдельной очереди, вы можете исследовать ошибки, возникающие при их обработке.
Чтобы воспользоваться этой функцией, вам придется сначала завести отдельную очередь того же типа, что и очередь, откуда перенаправляются сообщения, которые дошли до адресата, но не были обработаны. Включите функцию Перенаправлять недоставленные сообщения, выберите заранее созданную DLQ, а затем укажите количество попыток, после которых необработанное сообщение направляется в эту очередь.
Как можно работать с очередями в Yandex Message Queue
Помещение данных в очередь выполняется при помощи программных вызовов через специальный API, либо с использованием AWS CLI. Пример использования AWS CLI с YMQ вы можете найти в документации.
YMQ поддерживает API и другие подходы, которые используют в сервисе Amazon SQS, поэтому для работы с ними вы можете использовать уже существующие инструменты, например библиотеки boto3 для Python .
Тарификация
В рамках сервиса Message Queue тарифицируется количество запросов к стандартным очередям и очередям FIFO, а также исходящий трафик. Для целей тарификации каждые 64 КБ данных запроса считаются отдельным запросом.
Первые 100 000 запросов в месяц к очередям любого типа не оплачиваются. А далее их стоимость зависит от типа очереди: для стандартных очередей это 48,7600 ₽ за 1 миллион запросов, для FIFO — 61,1500 ₽.
Исходящий трафик до 10 ГБ не тарифицируется, а затем оплата за него составляет 1,5300 ₽ за 1 ГБ.
Допустим, за месяц было сделано 2,75 млн запросов объемом 48 КБ к стандартной очереди. Это значит, что нам нужно вычесть нетарифицируемое количество запросов из общего и привести его к тарифу за миллион запросов, а затем приплюсовать исходящий трафик исходя из того, что каждое сообщение умещается в 64 КБ, приведя размер каждого сообщения к гигабайтам. Считаем:
48,7600×((2750000−100000)/1000000)+1,53×((2750000×48/1024/1024)−10)=129,214+177,30=306,514 ₽
Более подробную информацию вы найдёте в документации.
На следующем уроке вы расширите созданное ранее приложение для проверки доступности yandex.ru, добавив в него возможность ставить задачи по проверке доступности других веб-ресурсов при помощи очередей.