Реальное использование JMS / очередей сообщений? [закрыто]

182

Я просто читал abit о JMS и Apache ActiveMQ. И было интересно, для чего в действительности люди используют JMS или подобные технологии очереди сообщений?

н.у.к.
источник

Ответы:

191

JMS (ActiveMQ - реализация JMS-брокера) может использоваться в качестве механизма, позволяющего обрабатывать асинхронные запросы. Возможно, вы захотите сделать это, потому что запрос занимает много времени или потому, что несколько сторон могут быть заинтересованы в фактическом запросе. Другая причина его использования - позволить нескольким клиентам (возможно написанным на разных языках) получать доступ к информации через JMS. ActiveMQ является хорошим примером здесь, потому что вы можете использовать протокол STOMP, чтобы разрешить доступ из клиента C # / Java / Ruby.

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

  • Храните заказ в какой-либо сторонней серверной системе (например, SAP)
  • Отправить электронное письмо клиенту, чтобы сообщить им, что его заказ был размещен

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

Джон
источник
Привет @jon ты видел этот тег документации? stackoverflow.com/documentation/jms/commit им просто нужна поддержка одного коммиттера, чтобы включить тему, я думаю, что вы могли бы быть единственным :), который позволяет им давать нам
отличные
@ Джон, насколько я понимаю, jms сам по себе является реализацией корпоративной схемы интеграции?
valik
Нет, Мул или Верблюд будут ...
Джон
1
Если какое-либо количество приложений может потреблять сообщения в очереди, как очередь узнает, когда удалять старые сообщения?
Василий Бурк
95

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

Публикация / подписка - еще один хороший метод для отделения отправителей от многих получателей. Это гибкая архитектура, потому что подписчики могут приходить и уходить по мере необходимости.

duffymo
источник
41
После прочтения вашего ответа я собираюсь добавить JMS в свою очередь «Что я буду изучать в этом году» :)
Roman
В наши дни вместо использования спецификации JMS мы можем использовать асинхронные вызовы методов. Для получения дополнительной информации см: docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html
гео
3
Они не совсем одинаковые. Там нет гарантированной доставки с вызовом асинхронного метода; нет понятия о темах, которые можно отправить сразу нескольким слушателям.
duffymo
75

У меня было так много удивительных применений для JMS:

  • Веб чат общение для обслуживания клиентов.

  • Отладка логов на бэкэнде. Все серверы приложений транслировали сообщения отладки на разных уровнях. Затем можно запустить клиент JMS, чтобы отслеживать сообщения отладки. Конечно, я мог бы использовать что-то вроде системного журнала, но это дало мне всевозможные способы фильтрации вывода на основе контекстной информации (например, по имени сервера приложения, вызову API, уровню журнала, идентификатору пользователя, типу сообщения и т. Д.). Я также раскрасил вывод.

  • Отладка записи в файл. То же, что и выше, только определенные части были извлечены с использованием фильтров и записаны в файл для общей регистрации.

  • Alerting. Опять же, установка, аналогичная описанной выше регистрации, отслеживания конкретных ошибок и оповещения людей с помощью различных средств (электронная почта, текстовые сообщения, IM, всплывающее окно Growl ...)

  • Динамическая настройка и управление программными кластерами. Каждый сервер приложений будет передавать сообщение «configure me», а затем демон конфигурации, который будет отвечать сообщением, содержащим все виды информации о конфигурации. Позже, если все серверы приложений нуждаются в изменении своих конфигураций одновременно, это можно сделать из демона config.

  • И обычные - поставленные в очередь транзакции для отсроченных действий, таких как выставление счетов, обработка заказов, обеспечение, генерация электронной почты ...

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

mikesomeone
источник
5
Мне кажется неправильным использовать JMS для ведения журнала отладки. Очереди и обмен сообщениями требуют значительных затрат, и ведение журналов (для отладки, в которой обычно много журналов) должно быть максимально быстрым.
Марко Альтьери
19

Распределенные (а) синхронные вычисления.
Примером из реальной жизни может служить структура уведомлений для всего приложения, которая отправляет письма заинтересованным сторонам в различные моменты в ходе использования приложения. Таким образом, приложение будет действовать как Producerсоздание Messageобъекта, помещая его в определенный объект Queueи двигаясь вперед.
Там будет набор Consumerс, которые подпишутся на Queueвопрос, и будет заботиться о обработке Messageотправленных через. Обратите внимание, что в ходе этой транзакции, Producers отделены от логики того, как данный Messageбудет обрабатываться.
Платформы обмена сообщениями (ActiveMQ и подобные) действуют как основа для облегчения таких Messageтранзакций, предоставляя MessageBrokers.

pugmarx
источник
Я хочу асинхронную обработку, потому что RestService Api является синхронным. Как это сделать с ActiveMq и Jms. Пожалуйста, помогите по этому вопросу. stackoverflow.com/questions/19706788/… . Спасибо за вашу помощь и время
Кумар
10

Я использовал его для отправки внутридневных сделок между различными системами управления фондами. Если вы хотите больше узнать о том, что такое отличная технология обмена сообщениями, я могу порекомендовать книгу « Шаблоны интеграции предприятия ». Есть несколько примеров JMS для таких вещей, как запрос / ответ и публикация / подписка.

Обмен сообщениями является отличным инструментом для интеграции.

RichardOD
источник
8

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

Например, скажем, у вас есть дорогой и очень важный элемент логики, такой как «купить вещи», важной частью покупки будет «уведомить магазин вещей». Мы делаем вызов notify асинхронным, чтобы любая логика / обработка, участвующая в вызове notify, не блокировала ресурсы и не конкурировала с ними с помощью бизнес-логики покупки. Конечный результат, покупка завершена, пользователь доволен, мы получаем наши деньги, и, поскольку очередь гарантирована, магазин получает уведомление, как только он открывается, или как только в очереди появляется новый товар.

Кевин Уильямс
источник
1
Пожалуйста, помогите в этом. stackoverflow.com/questions/19706788/… . Спасибо за вашу помощь и время.
Кумар
2
Но из-за асинхронного запроса ваше сообщение может не отправляться. Как насчет этого? Если вы хотите что-то купить, ваше послание должно быть отправлено. не так?
grep
8

Я использовал его для своего академического проекта, который был интернет-магазином, похожим на Amazon. JMS использовался для обработки следующих функций:

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

У нас было также несколько удаленных клиентов, подключенных к основному Серверу. Если соединение доступно, они используют для доступа к основной базе данных или, если не используют свою собственную базу данных. Для обеспечения согласованности данных мы внедрили механизм 2PC. Для этого мы использовали JMS для обмена сообщениями между этими системами, то есть одной, действующей в качестве координатора, который будет инициировать процесс, отправив сообщение в очередь, а другие ответят соответствующим образом, отправив обратно сообщение в очередь. Как уже упоминали другие, это было похоже на модель pub / sub.

БУКВ
источник
6

Я видел, как JMS использовался в различных коммерческих и академических проектах. JMS может легко войти в вашу картину, когда вы захотите иметь полностью отделенные распределенные системы. Вообще говоря, когда вам нужно отправить запрос с одного узла, и кто-то в вашей сети позаботится об этом без / с предоставлением отправителю какой-либо информации о получателе.

В моем случае я использовал JMS для разработки промежуточного программного обеспечения, ориентированного на сообщения (MOM), в моей диссертации, где конкретные типы объектно-ориентированных объектов генерируются на одной стороне как ваш запрос, а компилируются и выполняются на другой стороне как ваш ответ ,

paradisonoir
источник
6

Apache Camel, используемый в сочетании с ActiveMQ, является отличным способом создания шаблонов корпоративной интеграции.

Роб Дэвис
источник
5

Мы использовали обмен сообщениями для генерации онлайн котировок

BlueGene
источник
4

Мы используем JMS для связи с системами в огромном количестве удаленных сайтов по ненадежным сетям. Слабая связь в сочетании с надежным обменом сообщениями создает стабильный системный ландшафт: каждое сообщение будет отправлено, как только это станет технически возможным, большие проблемы в сети не будут влиять на весь системный ландшафт ...

по-круговой
источник