Что такое консьюмер (consumer) в системах обмена сообщениями?

«Что такое консьюмер (consumer) в системах обмена сообщениями?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Консьюмер (потребитель) — это компонент, который подписывается на источник данных (очередь, топик) и обрабатывает поступающие сообщения. Он является ключевой частью асинхронной, событийно-ориентированной архитектуры (например, с использованием Apache Kafka, RabbitMQ).

Как работает консьюмер:

  1. Подписка: Консьюмер указывает, из какой очереди или топика он хочет получать сообщения.
  2. Получение сообщений: Работает по модели pull (консьюмер сам запрашивает сообщения) или push (брокер сам отправляет сообщения).
  3. Обработка: Выполняет бизнес-логику на основе содержимого сообщения (сохранение в БД, вызов другого сервиса, логирование).
  4. Подтверждение (Acknowledgment): После успешной обработки консьюмер отправляет брокеру подтверждение (ACK), что позволяет брокеру удалить сообщение из очереди. Это гарантирует доставку "at-least-once".

Пример консьюмера для Apache Kafka на Python:

from kafka import KafkaConsumer

# Создание консьюмера, подписанного на топик 'orders'
consumer = KafkaConsumer(
    'orders',
    bootstrap_servers='localhost:9092',
    group_id='order-processors', # Группа потребителей для балансировки нагрузки
    auto_offset_reset='earliest', # С чего начать чтение, если смещение не найдено
    enable_auto_commit=False # Отключаем автоматическое подтверждение
)

for message in consumer:
    print(f"Получен заказ: {message.value.decode('utf-8')} из партиции {message.partition}")
    # ... обработка заказа ...
    consumer.commit() # Вручную подтверждаем обработку сообщения

Зачем это нужно? Консьюмеры обеспечивают развязку (decoupling) сервисов, масштабируемость (можно запустить несколько экземпляров в consumer group) и отказоустойчивость (сообщения не теряются при падении обработчика).