Почему разные consumer-группы в системах обмена сообщениями не конфликтуют за одно сообщение?

«Почему разные consumer-группы в системах обмена сообщениями не конфликтуют за одно сообщение?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Разные consumer-группы (потребительские группы) не конфликтуют, потому что они представляют разные логические подписки на один и тот же поток сообщений. Механизм доставки сообщений зависит от модели брокера.

Основные модели:

  1. Pub/Sub (Топики):

    • Каждая consumer-группа получает полную копию всех сообщений в топике.
    • Пример (Apache Kafka): Сообщение, опубликованное в топик orders, будет доставлено в группы notifications-service и analytics-service независимо.
      Topic: orders
      -> Consumer Group: notifications-service [Получает: Msg1, Msg2, Msg3]
      -> Consumer Group: analytics-service    [Получает: Msg1, Msg2, Msg3]
  2. Конкурентное потребление внутри группы:

    • Конфликт (конкуренция) возникает внутри одной consumer-группы. Брокер гарантирует, что каждое сообщение доставляется только одному потребителю внутри группы для балансировки нагрузки.
      Topic: orders, Partition 0
      -> Consumer Group: notifications-service
        -> Consumer-1 [Получает: Msg1, Msg3]
        -> Consumer-2 [Получает: Msg2]

Почему это важно: Эта модель позволяет реализовать шаблон «шины событий» (event bus), где одно событие может независимо обрабатываться разными сервисами (группами) для своих целей (отправка уведомления, обновление дашборда, расчёт статистики).