К какому классу систем относятся Kafka и RabbitMQ

«К какому классу систем относятся Kafka и RabbitMQ» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Kafka и RabbitMQ относятся к классу систем, известных как брокеры сообщений (Message Brokers) или системы обмена сообщениями (Messaging Systems).

Их основная задача — организация асинхронного взаимодействия между различными частями программной системы (сервисами). Они принимают сообщения от одних сервисов (продюсеров) и доставляют их другим (консьюмерам), обеспечивая слабую связанность (decoupling) компонентов.

Несмотря на общую цель, они основаны на разных парадигмах:

  • RabbitMQ

    • Парадигма: Традиционный брокер сообщений.
    • Модель: Реализует протокол AMQP, поддерживает сложные сценарии маршрутизации (direct, topic, fanout).
    • Назначение: Идеален для фоновых задач, RPC (удаленный вызов процедур) и гарантированной доставки сообщений конкретным получателям.
  • Apache Kafka

    • Парадигма: Распределенная платформа потоковой обработки событий (streaming platform).
    • Модель: Работает как распределенный, отказоустойчивый лог. Сообщения хранятся в топиках и могут быть прочитаны многократно разными консьюмерами.
    • Назначение: Оптимизирована для обработки больших потоков данных в реальном времени, аналитики, сбора логов и event sourcing.

Пример отправки сообщения в RabbitMQ:

# Пример отправки сообщения в RabbitMQ с помощью библиотеки pika
import pika

# 1. Установить соединение с сервером RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 2. Убедиться, что очередь 'task_queue' существует
channel.queue_declare(queue='task_queue')

# 3. Опубликовать сообщение
channel.basic_publish(
    exchange='',          # Обменник по умолчанию
    routing_key='task_queue', # Название очереди
    body='Process video 42' # Тело сообщения
)

print(" [x] Sent 'Process video 42'")
connection.close()