В чем разница между моделью Topic и моделью Queue в системах обмена сообщениями?

Ответ

Разница лежит в модели доставки сообщений потребителям.

  • Queue (Очередь, Point-to-Point):

    • Один потребитель на сообщение. Каждое отправленное сообщение обрабатывается только одним из подключенных потребителей (конкурентных consumers).
    • Сообщение удаляется из очереди после успешной обработки.
    • Идеально для распределения задач (Task Queue). Например, несколько воркеров обрабатывают задания из общей очереди.
      // JMS пример: Создание очереди
      Queue queue = session.createQueue("ORDER.PROCESSING");
      // Сообщение, отправленное в эту очередь, получит только один воркер.
  • Topic (Топик, Publish-Subscribe / Pub-Sub):

    • Много потребителей на сообщение. Сообщение, опубликованное в топик, получают все активные подписчики (subscribers).
    • Подписчики должны быть активны на момент публикации, иначе сообщение будет потеряно (если не используется durable subscription).
    • Идеально для событийной архитектуры (Event Broadcasting). Например, уведомление всех сервисов о смене статуса заказа.
      // JMS пример: Создание топика
      Topic topic = session.createTopic("ORDER.STATUS.UPDATED");
      // Сообщение, опубликованное в этот топик, получат все подписанные сервисы.
Сводная таблица: Модель Потребителей на сообщение Паттерн Пример использования
Queue 1 Point-to-Point Очередь задач, распределенная обработка.
Topic N (все подписчики) Publish-Subscribe Рассылка событий, нотификации.

Ответ 18+ 🔞

О, слушай, а вот тут, блядь, самая мякотка начинается! Разница-то не в том, какой порт крутить, а в том, как сообщение до потребителя доходит, ёпта. Прям принципиально!

  • Queue (Очередь, она же Point-to-Point):

    • Один лох — одна задача. Каждое сообщение, которое ты туда сунешь, схватит только один из этих голодных воркеров, которые на эту очередь подписаны. Остальные будут сидеть и бздеть.
    • Как только сообщение обработали — его, сука, удаляют. Чтобы второй раз не пришло.
    • Идеально, чтобы задачи по справедливости раскидать. Представь: у тебя куча заказов, и несколько одинаковых сервисов их обрабатывают. Кидаешь заказы в очередь — и они как волки набрасываются, каждый свой кусок хавает.
      // JMS пример: Создание очереди
      Queue queue = session.createQueue("ORDER.PROCESSING");
      // Сообщение, отправленное в эту очередь, получит только один воркер. Остальные в пролёте, блядь.
  • Topic (Топик, он же Publish-Subscribe / Pub-Sub):

    • Всем сестрам по серьгам! Ты крикнул что-то в топик — и это услышат все, кто в этот момент уши навострил (подписчики, subscribers).
    • Но тут, сука, подвох: если подписчик в этот момент в отъезде или спит — он проебал сообщение. Насовсем. (Ну, если только не настроил durable subscription, но это уже другая история, блядь).
    • Идеально, чтобы о событии всем по ушам дать. Например, статус заказа поменялся — и ты орушь об этом в топик. И бухгалтерия, и логистика, и служба поддержки — все сразу в курсе, ебать их в сраку. Все синхронно охуевают.
      // JMS пример: Создание топика
      Topic topic = session.createTopic("ORDER.STATUS.UPDATED");
      // Сообщение, опубликованное в этот топик, получат ВСЕ подписанные сервисы. Все до одного, как на митинге.

Короче, табличка для тех, кто любит глазами:

Штука Кто хавает сообщение Паттерн Куда применить
Queue (Очередь) Ровно один Point-to-Point Очередь задач, чтоб воркеры не дрались.
Topic (Топик) Все, кто подписался (N штук) Publish-Subscribe Кричать новости на всю деревню.

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