Полное руководство по собеседованию с RabbitMQ

опрос
Полное руководство по собеседованию с RabbitMQ

__Лучшего нет, есть только правильный

предисловие

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

Как создать режим высокой доступности RabbitMQ?

RabbitMQ имеет три режима: автономный режим, обычный режим кластера, режим зеркального кластера.
Ни одна машина, ни обычный кластер не могут обеспечить высокую доступность!
В автономном режиме нет необходимости вдаваться в подробности.
В обычном режиме кластера также нет высокой доступности. Хотя в этом режиме запускается несколько экземпляров RabbitMQ, каждая очередь все равно будет помещена только в один экземпляр RabbitMQ. Если потребитель потребляет из B, но потребляет очередь A, то B вам нужно вытягивать сообщения от A. Если A зависает, его нельзя использовать.

Режим зеркального кластера RabbitMQ

Зеркальный режим состоит из ведущего и нескольких ведомых, которые распределены по разным узлам. Все действия, кроме публикации, будут отправляться только мастеру.Мастер транслирует результат выполнения команды слейву, и слейв будет выполнять команду точно в том порядке, в котором мастер выполняет команду.Поэтому операция потребления очередь завершается на ведущем, но сообщения сохраняются синхронно на всех узлах.
Если ведущее устройство зависает, сообщения, отправленные производителем, также сохраняются на других ведомых устройствах.В это время, если ведомое устройство повышается до ведущего устройства, сообщения могут быть использованы снова!

Как RabbitMQ гарантирует, что данные не будут потеряны?

В прошлой статье говорилось о предотвращении потери данных с трех сторон: со стороны производства, самой очереди и со стороны потребителя 👍

  • Производственная сторона: Включить транзакции (не рекомендуется, слишком большая производительность снизит пропускную способность), рекомендуется включить режим подтверждения. После установки режима подтверждения на изготовителе каждому сообщению, которое вы пишете, будет присвоен уникальный идентификатор. После записи в RabbitMQ, RabbitMQ отправит вам обратно сообщение подтверждения, указывающее, что сообщение было успешно отправлено. Если RabbitMQ не сможет обработать сообщение, он вернет сообщение nack, сообщающее вам, что получение сообщения не удалось.
  • Сама очередь: Включите сохранение RabbitMQ, после того как сообщение будет записано, оно будет сохранено на диск, даже если машина зависнет, его можно будет восстановить.
  • Потребитель: подтвердите, что сообщение было правильно использовано с помощью механизма ручного подтверждения.

Как установить постоянство RabbitMQ?

  1. При создании очереди установите ее в состояние сохранения, чтобы RabbitMQ мог обеспечить сохранение метаданных очереди, но не сохранял данные в очереди.
  2. При отправке сообщения установите для параметра deliveryMode сообщения значение 2 и установите сохранение сообщения.

Каковы компоненты и функции RabbitMQ?

  • ConnectionFactory (диспетчер соединений): диспетчер, который устанавливает соединение между приложением и RabbitMQ.
  • Канал: канал, используемый для отправки сообщений. Канал — это виртуальное соединение, созданное на «реальном» TCP, команды AMQP отправляются через канал, каждый канал будет иметь уникальный идентификатор, будь то публикация сообщений, подписка на очередь или получение сообщений. через Канал.
  • Exchange (Exchange): используется для пересылки сообщений.Сообщение производителя сначала поступает на Exchange, а Exchange запрашивает таблицу маршрутизации (таблицу BindingKey) в соответствии с RoutingKey сообщения и отправляет сообщение в соответствующий Очередь.

Существует три часто используемых биржи:

  1. fanout: если биржа получит сообщение, оно будет передано всем связанным очередям.
  2. direct: если RoutingKey точно совпадает, сообщение доставляется в соответствующую очередь.
  3. тема: позволяет сообщениям из разных источников попадать в одну и ту же очередь. Если RoutingKey соответствует таблице маршрутизации (таблице BindingKey), его можно переадресовать.При использовании обмена темами для сопоставления также можно использовать подстановочные знаки.
  • Очередь: используется для хранения сообщений от производителей.
  • RoutingKey (ключ маршрутизации): сообщения производителя размещаются в разных очередях в соответствии с RoutingKey.
  • BindingKey (ключ привязки): используется для установления соединения (отношения привязки) между Exchange и Queue. Exchange создаст таблицу запроса информации о привязке для маршрутизации сообщений в разные очереди.
  • VHost: виртуальный хост, строго говоря, это не компонент, а концепция.В брокере (экземпляр RabbitMQ) можно установить несколько виртуальных хостов для разделения разрешений для разных пользователей.

Почему RabbitMQ использует Channel вместо TCP для прямой отправки команд?

Учитывая, что создание и уничтожение TCP обходится очень дорого, а операционная система может создавать ограниченное количество TCP в секунду, в часы пик будет создаваться большое количество соединений, что приведет к серьезной трате ресурсов и может привести к возникновению узких мест в системе.
Если мы используем TCP-соединение для каждого запроса, это не только удовлетворяет потребности в производительности, но и обеспечивает конфиденциальность каждого соединения, что идеально 👍.

Как RabbitMQ реализует отложенные очереди сообщений?

  1. После истечения срока действия сообщения оно поступает в обмен недоставленными сообщениями, а затем обмен пересылает его в очередь потребления задержки для реализации функции задержки.
  2. Используйте подключаемый модуль RabbitMQ-delayed-message-exchange для реализации отложенной функциональности.

RabbitMQ - это режим push или режим pull

RabbitMQ поддерживает оба режима, но в основном используется режим push.channel.basicConsume(QUEUE_NAME, false, consumer)Чтобы завершить потребление сообщений, режим push заключается в том, что RabbitMQ активно отправляет их потребителям для потребления, что активно предотвращает отставание сообщений.
можно использовать режим вытягиванияchannel.basicGet(QUEUE_NAME, false)Для получения сообщений он в основном используется при пакетной загрузке сообщений.

Увидимся!