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

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

157 голосов
/ 07 апреля 2011

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

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

Темы

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

Очереди

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

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

Есть мысли?

Ответы [ 9 ]

121 голосов
/ 07 апреля 2011

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

47 голосов
/ 31 июля 2013

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

24 голосов
/ 15 мая 2017

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

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

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

10 голосов
/ 19 марта 2019

Это просто:

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

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

enter image description here

8 голосов
/ 09 июля 2013

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

3 голосов
/ 10 января 2019

Очередь

Плюсы

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

Против

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

Тема

Плюсы

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

Против

  • Более сложный коммуникационный поток
  • Невозможно восстановить сообщение для одного слушателя.
3 голосов
/ 18 января 2015

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

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

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

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

1 голос
/ 10 июня 2018

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

0 голосов
/ 08 февраля 2014

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

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

...