Тема JMS против очередей

191

Мне было интересно, в чем разница между очередью JMS и темой JMS.

Страница ActiveMQ говорит

темы

В JMS тема реализует семантику публикации и подписки . Когда вы публикуете сообщение, оно отправляется всем заинтересованным подписчикам, поэтому многие подписчики получат копию сообщения. Только подписчики, имевшие активную подписку в момент получения сообщения брокером, получат копию сообщения.

Очереди

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

Я хочу иметь что-то, что будет отправлять копию сообщения каждому подписчику в той же последовательности, в которой это сообщение было получено брокером ActiveMQ.

Есть предположения?

Poliquin
источник

Ответы:

147

Это означает, что тема является подходящей. Очередь означает, что сообщение отправляется одному и только одному возможному подписчику. Тема идет каждому подписчику.

Джозеф Оттингер
источник
4
Есть идеи, как работает балансировка нагрузки для очередей в JMS или WSO2 MB?
Куласангар
это интересно, потому что я пытался отладить какого-то подписчика, и при отправке темы подписчик не вызывался, но при отправке в очередь это работало
vmrvictor
54

Темы предназначены для модели издатель-подписчик, а очереди - для точки-точка.

Викрам
источник
31

JMS тема является тип назначения в модели 1-к-многим распределения. Одно и то же опубликованное сообщение получают все подписчики . Вы также можете назвать это «широковещательной» моделью. Вы можете думать о теме как о эквивалентной теме в шаблоне проектирования Observer. для распределенных вычислений. Некоторые провайдеры JMS эффективно выбирают реализацию этого как UDP вместо TCP. Что касается темы, то доставка сообщений - «забей и забудь» - если никто не слушает, сообщение просто исчезает. Если это не то, что вы хотите, вы можете использовать «долговременные подписки».

Очередь JMS является местом 1-к-1 сообщений. Сообщение принимается только одним из получателей-получателей (обратите внимание: постоянное использование подписчиков для «тематического клиента» и получателей для очереди клиента позволяет избежать путаницы). Сообщения, отправленные в очередь, хранятся на диске или в памяти до тех пор, пока кто-нибудь не заберет их или срок их действия не истечет. Таким образом, очереди (и долговременные подписки) нуждаются в активном управлении хранением, вам нужно думать о медленных потребителях.

В большинстве сред, я бы сказал, темы являются лучшим выбором, потому что вы всегда можете добавить дополнительные компоненты без необходимости менять архитектуру. Добавленные компоненты могут быть мониторингом, ведением журнала, аналитикой и т. Д. В начале проекта вы никогда не знаете, какими будут требования через 1 год, 5 лет, 10 лет. Изменения неизбежны, примите это :-)

Аксель Подел
источник
28

Это так просто:

Очереди = Вставить> Снять (отправить одному подписчику) 1: 1

Темы = Вставить> Трансляция (отправить всем подписчикам) 1: n

введите описание изображения здесь

Даниэль Перник
источник
2
Примером может служить простая социальная сеть. Кто-то «любит» пост. Бэкэнд публикует в теме событие «POST LIKE». Он потребляется 3 подписчиками: notificationProcessor(отправляет уведомление karmaProcessorпостеру ), (передает карму лайкеру и постеру), feedProcessor(перемещает джот вверх в каналы людей). Все асинхронно конечно.
Сиддхартха
@ Сиддхартха, это может быть ответом в качестве примера, спасибо!
Сел Мн
8

Что касается сохранения заказа, см. Эту страницу ActiveMQ . Короче говоря: заказ сохраняется для одного потребителя, но у нескольких потребителей заказ доставки не гарантируется.

eebbesen
источник
7

Очереди

Pros

  • Простой шаблон обмена сообщениями с прозрачным коммуникационным потоком
  • Сообщения можно восстановить, поместив их обратно в очередь

Cons

  • Только один потребитель может получить сообщение
  • Подразумевает связь между производителем и потребителем, поскольку это отношение один к одному

темы

Pros

  • Несколько потребителей могут получить сообщение
  • Разделение между производителем и потребителем (шаблон «публикация и подписка»)

Cons

  • Более сложный поток общения
  • Сообщение не может быть восстановлено для одного слушателя
Abhimanyu
источник
4

Если у вас есть N потребителей, то:

Темы JMS доставляют сообщения N из N Очереди JMS доставляют сообщения 1 из N

Вы сказали, что «ищете« вещь », которая будет отправлять копию сообщения каждому подписчику в той же последовательности, в которой это сообщение было получено брокером ActiveMQ».

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

Ханс Йесперсен
источник
1

ТЕМА :: тема - это общение один-ко-многим ... (многоточечный или публиковать / подписаться) Пример: - представьте, что издатель публикует фильм в YouTube, тогда все его подписчики получат уведомление .... QUEVE :: queve - один-к -единство ... Пример: -При публикации запроса на пополнение он отправляется только одному qreciever ... всегда помните, что если запрос поступил на все приемники, то произошло многократное пополнение, поэтому при разработке анализа, подходящего для приложения

Сиддартха Камбл
источник
-1

Очередь - это управляемый объект JMS, используемый для хранения сообщений, ожидающих приема подписчиков. Когда все подписчики использовали сообщение, сообщение будет удалено из очереди.

Тема заключается в том, что все подписчики темы получают одно и то же сообщение при публикации сообщения.

Гита Редди Мануконда
источник
2
Очередь сообщений будет потребляться только один раз на одного потребителя, поэтому очередь реализует нагрузки балансира. Подписки на темы могут быть длительными : подписчик может получить сообщение спустя много времени после публикации (например, если подписчик был отключен и снова подключился).
Грубер