Что такое RabbitMQ
RabbitMQ
является брокером сообщений, основная задача принимать и пересылать сообщения. RabbitMQ
работает по сути так-же как почтовое отделение. Вы кладете почту в почтовый ящик, после чего можете быть уверены, что сотрудник почты в конечном итоге доставит вашу почту получателю. Основное различие между RabbitMQ
и почтой заключается в том, что мы не имеем дело с бумагой, RabbitMQ
принимает, хранит, пересылает двоичные данные - сообщения.
RabbitMQ
это платформа позволяющая обмениваться сообщениями. Что может быть в сообщении, решать только вам. Обмениваться можно как на одном сервере, так и с одного на другой. Это отличный способ масштабирования, с хорошо настроенным RabbitMQ
мы можем просто подключать новые сервера, настроив на них нужное ПО и прописав конфигурацию, а RabbitMQ
будет сам делегировать работу между всеми серверами.
Типы взаимодействий
Синхронный протокол
один из примеровHTTP
, клиент отправляет запрос сервису и ожидает ответа. Важной особенностью протоколаHTTP/HTTPS
является синхронность. Дальнейшее исполнение клиентского кода возможно только после получения ответа от сервераHTTP
Асинхронный протокол
примерAMQP
, поддерживается многими операционными системами и облачными средами. Код клиента или отправитель сообщения обычно не ожидают ответа. Они просто отправляют сообщение в сервис передачи сообщений, такой какRabbitMQ
илиKafka
Недостатки синхронного протокола
- Если добавлять новые микросервисы, которые взаимодействуют друг с другом, то использование конечных точек в коде вызовет беспорядок. Особенно в тех случаях, когда нужно передать в конечную точку экстренную информацию, например токен авторизации
- Ответа придется ожидать некоторое время, а при его отсутствии выполняются повторные вызовы, что снижает производительность
- Если сервис приема данных не работает или не может обработать запрос, выполняется процедура ожидания. Например, пользователь размещает заказ в интернет-магазине. В сервис доставки отправляется запрос на отправку заказа, но если он не работает, то заказ теряется. Как отправить тот же заказ в сервис доставки после ее активации?
- Принимающая сторона может быть временами перегружена запросами. В этом случае нужен буфер для ожидания до тех пор, пока получатель не освободится
Чтобы решить эти проблемы, можно использовать промежуточный сервис, известный как брокер сообщений
, который управляет связью между двумя микросервисами. В качестве брокера сообщений часто применяют RabbitMQ
.
Протокол AMQP
RabbitMQ
работает на основе протокола AMQP
(Advanced Message Queuing Protocol), открытый протокол для передачи сообщений между компонентами системы. Основная идея состоит в том, что отдельные подсистемы, или независимые приложения могут обмениваться произвольным образом сообщениями через AMQP-брокер
, который осуществляет маршрутизацию, возможно гарантирует доставку, распределение потоков данных, подписку на нужные типы сообщений.
Для того, чтобы научить работать PHP
с протоколом AMQP
используются специальные обертки, я использую bunny/bunny
, вот список всех возможных:
Базовые cущности RabbitMQ
Message
сообщение, состоящее из заголовка и тела. Заголовок-это коллекция различных атрибутов, добавленных продюсерами, в том числе: сохраняется ли сообщение, каков приоритет, какая очередь получения сообщений и т.д. Тело сообщения представляет собой данные которые нужно передатьProducer
отправитель, отправляющий сообщенияConsumer
получатель, принимающий сообщения, обычно получатель находится в состоянии ожидания сообщенийExchange
обменник, в него отправляются сообщения, обменник является маршрутизатором распределяющим сообщения в одну или несколько очередей. Маршрутизация сообщений в очередь идет на основе созданных связей между обменником и очередьюQueue
очередь, это имя почтового ящика, который находится внутриRabbitMQ
. Хотя сообщения проходят черезRabbitMQ
и ваше приложение, они могут храниться только внутри очереди. Очередь не имеет ограничений на количество принимаемых сообщений. По сути можно считать, что буфер является бесконечным и ограничен только ресурсами машины. Любое количество отправителей может отправлять сообщения в очередь, а любое количество получателей может попытаться получить данные из этой очереди
Методы RabbitMQ
ack()
подтверждает получение сообщения, удаляет сообщение из очередиreject()
отвергнуть получение, можно только одно сообщениеnack()
отвергнуть получение, можно сразу несколько сообщений