что такое JMS хорошо для? [закрытый]


Я ищу (простые) примеры проблем, для которых JMS является хорошим решением, а также причины, по которым JMS является хорошим решением в этих случаях. В прошлом я просто использовал базу данных как средство передачи сообщений от A к B, Когда сообщение не обязательно должно быть обработано B немедленно.

гипотетический пример такой системы, где все вновь зарегистрированные пользователи должны быть отправлены приветственное письмо в течение 24 часов после регистрации. Для аргументации предположим, что DB не записывает время регистрации каждого пользователя, а вместо этого в таблице pending_email хранится ссылка (внешний ключ) на каждого нового пользователя. Задание отправителя электронной почты выполняется один раз в 24 часа, отправляет сообщение электронной почты всем пользователям в этой таблице, а затем удаляет все записи pending_email.

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

чего мне не хватает? - Дон

11 70

11 ответов:

JMS и обмен сообщениями на самом деле о 2 совершенно разных вещах.

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

Посмотреть подробнее на сайте как очередь сравнивается с темой

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

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

например, представьте, что вы пишете веб-балансировщик нагрузки с помощью таблицы базы данных:)

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

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

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

  • асинхронные связь: приложение должно уведомить другого, что событие произошло без необходимости ждать ответа.
  • надежность. Обеспечьте доставку сообщений один раз и только один раз. С вашим подходом к БД вам нужно "изобрести колесо", особенно если у вас есть несколько клиентов, читающих сообщения.
  • свободная связь. Не все системы могут взаимодействовать с помощью базы данных. Таким образом, JMS довольно хорошо используется в гетерогенных средах с развязанными системами, которые могут взаимодействовать через границы системы.

реализация JMS является "push", в том смысле, что вам не нужно опрашивать очередь, чтобы обнаружить новые сообщения, но вы регистрируете обратный вызов, который вызывается, как только появляется новое сообщение.

чтобы обратиться к исходному комментарию. то, что было первоначально описано, является сутью (точка-точка) JMS. преимущества JMS, однако:

  1. вам не нужно писать код самостоятельно (и, возможно, испортить логику, чтобы она не была такой стойкой, как вы думаете). кроме того, сторонний impl может быть более масштабируемым, чем простой подход к базе данных.

  2. JMS обрабатывает публикацию / подписку, что немного сложнее, чем "точка-точка" пример

  3. вы не привязаны к конкретной реализации, и можете поменять его, если ваши потребности изменятся в будущем, без Мессинга с вашим кодом java.

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

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

b) в случае базы данных потребитель сообщения должен опросить базу данных для сообщений, где as JMS обеспечивает обратный вызов при поступлении сообщения (как упоминалось sk)

C) балансировка нагрузки-если приходит много сообщений, легко иметь пул процессоров сообщений в JMS.

d) в целом реализация через JMS будет проще и потребует меньше усилий, чем маршрут базы данных

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

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

JMS-это просто вид интерфейсы / API и конкретные классы должны быть реализованы. Они уже реализованы различными организациями / поставщиками. они называются провайдерами JMS. Пример WebSphere от IBM или FioranoMQ С помощью программного обеспечения Fiorano или ActiveMQ от Apache, HornetQ, OpenMQ и т. д. .Другие используемые терминологии-это объекты администрирования (темы,очереди,ConnectionFactories),производитель/издатель JMS, клиент JMS и само сообщение.

Итак, перейдем к вашему вопросу - what is JMS good for? Я бы хотелось бы привести практический пример, чтобы проиллюстрировать его важность.

День Торговли

есть такая функция называется LVC(последнее значение кэша)

в торговле цены на акции публикуются издателем через регулярные промежутки времени. С каждой общей папкой связана тема, в которой она публикуется. Теперь, если вы знаете, что такое тема, вы должны знать, что сообщения не сохраняются, как очереди. Сообщения публикуются подписчикам живыми в то время сообщение было опубликовано (исключение составляют абоненты Durables, которые получают все сообщения, опубликованные с момента его создания, но опять же мы не хотим получать слишком старые цены на акции, которые отбрасывают возможность его использования). Поэтому, если клиент хочет знать цену акций, он создает подписчика, а затем он должен ждать, пока следующая цена акций не будет опубликована(что опять же не то, что мы хотим). Вот где LVC входит в картину. Каждое сообщение LVC имеет связанный ключ. Если сообщение отправляется с помощью LVC ключ (для определенного запаса), а затем еще одно сообщение об обновлении с тем же ключом, которое позже переопределяет предыдущее. Когда когда-либо подписчик подписывается на тему(в которой включен LVC), подписчик получит все сообщения с различными ключами LVC. Если мы сохраняем отдельный ключ для каждой зарегистрированной компании, то когда клиент подписывается на него, он получит последнюю цену акций и в конечном итоге все обновления.

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

Гвидо имеет полное определение. Из моего опыта все это важно для хорошей пригонкой.

одно из применений, которое я видел, - это распределение заказов на складах. Представьте себе офисную компанию, которая имеет достаточное количество складов, которые поставляют большие офисы с офисными принадлежностями. Эти заказы поступят в центральное место, а затем будут упакованы для правильного склада для распространения. Склады не имеют или не хотят высокоскоростных соединений в большинстве случаев поэтому заказы толкаются вниз к ним через модемы удаленного доступа, и это-то, где асинхронный входит. Телефонные линии на самом деле не так важны, поэтому половина заказов может попасть, и именно здесь важна надежность.

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

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

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

здесь есть хорошая запись с некоторыми примерами:http://www.winslam.com/laramee/jms/index.html

решение "база данных как очередь сообщений" может быть тяжелым для задачи. Решение JMS менее тесно связано с тем, что отправителю сообщения не нужно ничего знать о получателе. Это может быть достигнуто с помощью некоторой дополнительной абстракции в "базе данных как очереди сообщений", так что это не огромная победа...Кроме того, вы можете использовать очередь в режиме "публикация и подписка", что может быть удобно в зависимости от того, что вы пытаетесь выполнить. Это также хороший способ для дальнейшего отделите ваши компоненты. Если все ваши коммуникации находятся в пределах одной системы и / или наличие журнала, который сразу доступен для приложения, очень важно, ваш метод кажется хорошим. Если вы общаетесь между отдельными системами JMS является хорошим выбором.

JMS в сочетании с JTA (Java Transaction API) и JPA (Java persistence API) может быть очень полезным. С помощью простой аннотации вы можете поместить несколько действий с базой данных + отправка/получение сообщений в одну транзакцию. Поэтому, если один из них терпит неудачу, все откатывается с использованием того же механизма транзакций.