Доброго времени суток, уважаемый читатель, в этой статье, используя не самый удачный вариант редактора текста от Яндекс Дзена, я попробую рассказать, что такое очереди сообщений, как и где их используют, а так же в качестве примера, расскажу про одну из реализаций очереди, называемой RabbitMQ.
Что такое очередь сообщений?
Давайте представим, что мы разработчики крупного сервиса, например сервиса для проверки домашних заданий студентами для всего университета. И нам нужно как то настроить систему взаимодействия процессов внутри вашего сервиса, а так же иметь возможность в будущем настроить взаимодействие вашего сервиса с другими сервисами.
Тут и встает вопрос:
"Как это сделать?"
На этот вопрос есть сразу четыре ответа, ведь все взаимодействия различный процессов, сервисов и систем между собой, можно разделить на четыре типа:
- Через Файл
- Через API
- Через Базу Данных
- Через Очередь
Все они имеют свои плюсы и минусы, но как вы поняли исходя из названия статьи, сегодня мы поговорим только про очередь.
Очередь - это структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел». Добавление элемента возможно лишь в конец очереди, а вывод — только из начала, при этом выбранный элемент из очереди удаляется.
Тогда как очередь сообщений (Message Queue) - представляет собой механизм, в состав которого входит брокер - это центральный элемент, который занимается обработкой запросов, сбором и маршрутизацией сообщений на основе предопределённой логики и некий буфер для хранения сообщений на пути от отправителя к получателю.
Сообщения, помещенные в этот буфер, хранятся до тех пор, пока получатель их не получит. А целиком вся эта система реализует шаблон асинхронной связи между отправителем и получателем, который так и называется отправитель/получатель (Publisher-Subscriber).
Для наглядности расскажу пример, подобная система реализована в известном вам всем сервисе Netflix.
Основной бизнес-процесс выглядеть так:
- Подписчики подписываются на сообщение в случае Netflix это их видео контент.
- Netflix создает новый фильм.
- Netflix публикует этот фильм в своей системе.
- Фильм какое-то время хранится в системе.
- Netflix публикует фильм всем подписчикам.
- Подписчики получают доступ к новому фильму.
Это всего лишь один из множества примеров реализации этого механизма, он используется практически в каждом известном на сервисе, например на его основе разработана технология AJAX, благодаря загружаются веб страницы в браузерах, да и технология самого браузера тесно связана с очередью, но об этом в другой раз.
Плюсы и минусы очередей:
Плюсы:
- Большая надежность - сообщение хранится у брокера, а каждый процесс получает тикет на исполнение
- Низкая связность - хранение и обработка сообщений остается отдельному сервису
- Возможность распределять нагрузку - мы можем добавлять новых обработчиков для масштабирования.
- Отложенная обработка - мы можем не ждать завершения обработки, а отложить ее.
Минусы:
Главным минусом очереди является необходимость в брокере, через который система становится уязвимой
Что же такое RabbitMQ ?
Вот мы и дошли до самого интересного, кто же этот ваш RabbitMQ.
RabbitMQ - это брокер сообщений с открытым исходным кодом, который маршрутизирует сообщения. То есть принимает отправленные приложением-продюсером сообщения и доставляет их приложению-потребителю.
Составные части
Пробежимся по названиям сверху вниз:
- Producer — приложение-продюсер публикует (паблишит) сообщения в Rabbit.
- Exchange — обменник. Сущность Rabbit, точка входа для публикации всех сообщений.
- Binding — связь между Exchange и очередью.
- Queue — очередь для хранения сообщений.
- Consumer — подписывается на очередь и получает от Rabbit сообщения.
Описание процесса
- Producer Создаёт соединение (connection) по протоколу AMQP (Advanced Message Queuing Protocol), в рамках соединения создаёт канал (channel) и отправляет сообщение в обменник (Exchange)
- Exchange направляет сообщение в соответствующую очередь, в зависимости от типа обмена и биндинга.
- Consumer подписывается на очередь и начинает получать сообщения из нее;
- Consumer обрабатывает сообщения и выполняет необходимые действия;
- Consumer подтверждает получение сообщения, чтобы исключить его из очереди;
- Если сообщение не было подтверждено в течение определенного времени, оно будет повторно отправлено в очередь.
Типы Exchange
Выделяют четыре типа Exchange (Direct, Topic, Fanout, Headers), но мы рассмотрим три, потому что они есть на картинке, рассмотрим их.
Direct exchange — передаёт сообщения в очереди на основе ключа маршрутизации, передает в одну конткретную очередь. Этот тип используется по умолчанию.
Topic exchange — аналогичен direct exchange, но маршрутизация выполняется в соответствии с шаблоном. Вместо фиксированного ключа маршрутизации здесь используются символы подстановки.
Fanout exchange — передаёт сообщения во все очереди.
Header exchange — определяет целевую очередь по заголовкам сообщений.
Итог
Сегодня мы узнали что такое очереди сообщений, где они используются, для чего они нужны и рассмотрели работу одного из самых популярных сервисов реализующих очередь сообщений - RabbitMQ.
Надеюсь вам было интересно и вы сумели разобраться в этой теме, а если нет, то не страшно, не у вам же с этим работать, главное что я понял. В любом случае, спасибо за внимание. делитесь этой статьей, ставьте лайки, колокольчики, оставляйте комментарии.
P.S
Будет вторая часть этой статьи про практическое применение RabbitMQ, посмотрим как его поднять, развернуть подключить и выполнем практическое задание.