Главная задача очередей — организовать независимую работу поставщиков и потребителей информации в системах реального времени.

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

  • надёжной передачи данных и команд между компонентами;
  • обработки данных от множества устройств IoT;
  • обработки событий, по которым должна быть вызвана функция.

Стоит учитывать, что у очередей есть ряд ограничений. Главным из них является неопределённое время на обработку принимающей стороной. Сложно предсказать, когда потребитель получит и обработает элемент.

Существует два распространённых типа очередей: FIFO и стандартная.

FIFO означает «first in, first out», т. е. порядок размещения данных в очереди совпадает с порядком, в котором данные из нее считываются. Очереди FIFO используются в тех случаях, когда нужно обеспечить строгий порядок доставки и однократную обработку сообщений. Например, соблюдение исходного порядка важно для финансовых транзакций. Если представить, что у клиента на счету было 2 000 рублей, и он сначала положил туда 10 000, а затем потратил 5 000, то очевидно, что порядок выполнения транзакций имеет значение. Стоит отметить, что у очередей FIFO сравнительно небольшое количество вызовов API в секунду.

В свою очередь из стандартных очередей сообщения по возможности считываются последовательно, но соблюдение исходного порядка при доставке сообщений не гарантируется. Преимуществом этого подхода является более высокая в сравнении с FIFO пропускная способность: стандартные очереди поддерживают сравнительно большое количество вызовов API в секунду (отправка, принятие или удаление сообщения).

Что такое сообщение

Основным понятием для очередей в 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.

Практика

Работа с очередью: https://practicum.yandex.ru/trainer/ycloud/lesson/497f8e56-8d25-44c7-b109-3b3935bdd6df/

Конвертер из видео в гиф: https://practicum.yandex.ru/trainer/ycloud/lesson/3fbf06ae-50f4-439e-8c70-ad6046f7c64a/

Сокращатель ссылок: https://practicum.yandex.ru/trainer/ycloud/lesson/8c75809b-28a0-4898-ba8a-23fc2c3dc677/


📂 YandexCloud | Последнее изменение: 15.08.2024 13:28