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

Почему понадобились очереди сообщений

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

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

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

Что такое обмен серверными сообщениями и как он устроен

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

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

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

Когда в вашем бэкенд-приложении задействованы очереди, обработка видео выглядит так:

  1. Сервер получает запрос на обработку видео от клиента.
  2. Он сохраняет видео на сервере и сообщает другому приложению, расположенному на соседнем сервере, что поступил запрос на обработку. Для этого сервер бэкенда формирует специальное сообщение и отправляет его в очередь сообщений.
  3. Сервер обработки видео получает запрос от своего коллеги, обрабатывает контент и через шину сообщений сообщает о том, что все обработано.
Схема асинхронного обмена сообщениями между приложениями. Источник
Очередь сообщений делает для нас две классных вещи: помогает решить проблему обработки больших объемов данных и позволяет распределить нагрузку и функции между разными серверами.

FIFO и LIFO (ФИФО и ЛИФО) — что это такое

Сервисы обмена сообщениями между серверами делятся на два типа:

  • Очереди (ФИФО-метод) — «первый пришел и первый ушел» (First in First out). Принцип FIFO означает: сообщение, которое первым попало в очередь, первым же отправляется на обработку.
  • Стеки (LIFO) — «пришел последним, а ушел первым» (Last in First out). В отличие от системы FIFO, стек можно представить в виде стопки тарелок: вы кладете тарелки друг на друга и сначала берете верхние тарелки.
Для серверных приложений наиболее востребованы очереди (метод FIFO), но большинство сервисов для организации очередей могут работать и в режиме стека (LIFO).

Сервисы для организации очередей сообщений

Популярные сервисы для организации очередей сообщений — RabbitMQ, Apache Kafka и Redis. Давайте посмотрим, чем они различаются.

RabbitMQ

Сервер организации очередей сообщений, написанный на языке программирования Erlang. Это распределенный и горизонтально масштабируемый брокер сообщений. Он позволяет разным программам взаимодействовать с помощью протокола AMQP, а через дополнительные модули — и с помощью некоторых других протоколов: MQTT, HTTP и так далее.

RabbitMQ — это инструмент, который силен в маршрутизации сообщений. Система поддерживает несколько видов распределения сообщений в сети, их комбинация позволяет создавать очень хитрые правила доставки сообщений.

Apache Kafka

Apache Kafka — продукт, который реализует систему распределенного журнала событий. Kafka славится своей скоростью работы и масштабируемостью. Из-за способности передавать терабайты данных эту систему очередей сообщений любят разработчики, работающие с Big Data. Например, ее используют в Airbnb, Adidas, Cisco и PayPal.

Redis

Redis создавалась как система хранения данных в оперативной памяти. Изначальное предназначение — ускорение доступа к востребованной информации и построение систем кеширования.

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

Где применяют системы обработки сообщений

  1. Асинхронная обработка задач

    Задачи на обработку больших объемов данных уходят в очередь сообщений (Message Queuing), что позволяет организовать асинхронную распределенную обработку данных.

  2. Коммуникации между микросервисами

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

  3. Событийно-ориентированные системы

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

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