Что такое 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()отвергнуть получение, можно сразу несколько сообщений