Что такое брокер сообщений (Message Broker)?

«Что такое брокер сообщений (Message Broker)?» — вопрос из категории Брокеры сообщений, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Брокер сообщений — это промежуточное ПО, которое обеспечивает асинхронную коммуникацию между различными сервисами (микросервисами) или компонентами распределённой системы. В моей практике он выступает "позвоночником" для событийно-ориентированной архитектуры.

Основные функции, которые я использую:

  • Асинхронность и декапплинг: Отправитель и получатель не должны работать одновременно или знать друг о друге.
  • Буферизация и балансировка нагрузки: Сообщения накапливаются в очереди, позволяя потребителям обрабатывать их в своём темпе.
  • Гарантированная доставка: Подтверждения (acknowledgements) и механизмы повторной отправки (retry).
  • Маршрутизация: Отправка сообщений по определённым правилам (direct, topic, fanout).

Популярные брокеры в стеке DevOps и их применение:

Брокер Модель Ключевое применение в инфраструктуре
RabbitMQ Очереди (AMQP) Фоновые задачи (обработка заказов, отправка email), RPC.
Apache Kafka Поток событий (лог-топики) Сбор логов, метрик, стриминг данных, аудит событий.
AWS SQS / Google PubSub Managed-очереди (облачные) Связь сервисов в облаке, отказоустойчивость.

Пример типичной задачи с RabbitMQ (DevOps-перспектива): Мы использовали RabbitMQ для обработки задач развёртывания. CI/CD пайплайн (Jenkins/GitLab CI) помещал сообщение о новом билде в очередь deployments. Группа воркеров-потребителей (на разных серверах) забирала задачи и выполняла деплой на целевые среды, обеспечивая отказоустойчивость и масштабируемость.

Конфигурация воркера (упрощённо):

import pika, json, subprocess

connection = pika.BlockingConnection(pika.ConnectionParameters('rabbitmq.internal'))
channel = connection.channel()
channel.queue_declare(queue='deployments', durable=True) # Очередь переживёт перезагрузку брокера

def deploy_callback(ch, method, properties, body):
    task = json.loads(body)
    print(f"Deploying service {task['service']} version {task['version']}")
    # Вызов скрипта деплоя (Ansible, shell)
    # subprocess.run(["./deploy.sh", task['service'], task['version']])
    ch.basic_ack(delivery_tag=method.delivery_tag) # Подтверждаем обработку

channel.basic_qos(prefetch_count=1) # Обрабатываем по одной задаче за раз
channel.basic_consume(queue='deployments', on_message_callback=deploy_callback)
channel.start_consuming()

Ключевые метрики для мониторинга брокера: длина очереди, rate сообщений, количество неподтверждённых сообщений, доступность соединений.