Что такое RabbitMQ и каковы его основные компоненты

Ответ

RabbitMQ — это популярный брокер сообщений с открытым исходным кодом, который реализует протокол AMQP (Advanced Message Queuing Protocol). Он используется для построения распределенных и отказоустойчивых систем, позволяя различным сервисам асинхронно обмениваться данными.

Основные компоненты

  • Producer (Издатель): Приложение, которое отправляет (публикует) сообщения.
  • Exchange (Обменник): Получает сообщения от издателей и маршрутизирует их в одну или несколько очередей. Тип обменника (direct, topic, fanout, headers) определяет логику маршрутизации.
  • Queue (Очередь): Буфер, который хранит сообщения до тех пор, пока они не будут обработаны потребителем.
  • Consumer (Потребитель): Приложение, которое подписывается на очередь, получает и обрабатывает сообщения.

Пример использования (Python с библиотекой pika)

1. Producer (отправитель сообщения)

Этот скрипт подключается к RabbitMQ, создает очередь hello и отправляет в нее сообщение.

# producer.py
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello, World!')
print(" [x] Sent 'Hello, World!'")
connection.close()

2. Consumer (получатель сообщения)

Этот скрипт подписывается на очередь hello и обрабатывает поступающие сообщения.

# consumer.py
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(f" [x] Received {body.decode()}")

channel.basic_consume(queue='hello',
                      on_message_callback=callback,
                      auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

RabbitMQ широко применяется в микросервисных архитектурах для организации взаимодействия между сервисами, а также для выполнения отложенных и фоновых задач.

Ответ 18+ 🔞

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

Из чего эта хрень собрана

  • Producer (Издатель): Это тот, кто начинает базар. Приложение, которое кричит: "Эй, у меня тут сообщение есть, на, забери кто-нибудь!"
  • Exchange (Обменник): Центральный распределительный щит, ёпта. Получает крики от издателя и решает, в какую именно очередь их пихнуть. У него есть типы — direct, topic, fanout, headers — от этого зависит, куда полетит сообщение. Как начальник почты, только не пьёт.
  • Queue (Очередь): Ну, собственно, очередь, блядь. Конвейерная лента или ящик, где сообщения ждут, пока их не заберут. Стоят, терпят, как в МФЦ.
  • Consumer (Потребитель): Тот, кто в конце концов приходит и забирает это сообщение из очереди, чтобы что-то с ним сделать. Рабочая лошадка системы.

Пример на питоне, с библиотекой pika (не путать с пи*кой)

1. Producer (тот, кто отправляет)

Вот этот скрипт подключается к кролику на локалхосте, создаёт очередь с названием hello и шлёт туда своё "Hello, World!", как будто это гениально.

# producer.py
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello, World!')
print(" [x] Sent 'Hello, World!'")
connection.close()

2. Consumer (тот, кто получает и офигевает)

А этот — подписывается на ту же очередь и сидит, как сыч, ждёт, когда ему что-то прилетит. Как только прилетает — печатает, довольный.

# consumer.py
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(f" [x] Received {body.decode()}")

channel.basic_consume(queue='hello',
                      on_message_callback=callback,
                      auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

В общем, RabbitMQ — это овердохуища полезная вещь, когда у тебя микросервисы разбежались, как тараканы, и им нужно как-то общаться, не засирая друг другу логику. Или когда задачи нужно выполнять не сразу, а когда-нибудь потом, в фоне, чтобы пользователь не ждал, блядь, вечность.