Обмен сообщениями, очереди и ESB - я знаю, где я хочу быть, но не знаю, как туда добраться - PullRequest
5 голосов
/ 24 декабря 2008

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

Хорошо, вот что я хотел бы:

Я бы хотел, чтобы HTTP был основным транспортным механизмом. Когда одно приложение, например, CMS, будет обновлено, оно свяжется с брокером по http и скажет "I've changed", затем брокер отправит обратно 200 OK, чтобы сказать "thanks I got the message".

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

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

Проблема в том, что я даже не знаю, с чего начать и что мне нужно, чтобы это произошло. Я смотрю на XMPP , ActiveMQ , RabbitMQ , Mule ESB и т. Д. И вижу, что в следующем году я мог бы потратить вокруг в кругах с этим материалом.

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

Ответы [ 6 ]

7 голосов
/ 24 декабря 2008

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

Веб-клиент основан на Flex. Наш стек среднего уровня состоит из:

  • Java 6
  • Tomcat 6
  • BlazeDS
  • Spring Framework-
  • ActiveMQ (JMS-брокер сообщений)

BlazeDS может быть настроен как мост для JMS. Это сервлет Tomcat, который отвечает на вызовы удаленного взаимодействия клиента Flex, но также может отправлять сообщения клиентам, когда появляются новые сообщения в разделе JMS, для которого он настроен.

BlazeDS реализует шаблон Comet для выполнения отправки сообщений на стороне сервера:

Асинхронная архитектура HTTP и Comet Введение в асинхронное неблокирующее программирование HTTP

Farata Systems объявила, что они модифицировали BlazeDS для работы с продолжением Jetty для реализации Comet Pattern. Это позволяет масштабировать до тысяч соединений Comet на одном физическом сервере.

Farata Systems добивается прорыва в производительности благодаря Adobe BlazeDS

Мы ждем, чтобы Adobe внедрила поддержку Servlet 3.0 в самих BlazeDS, поскольку в целом мы справедливо настроены на использование Tomcat и Spring в комбинации.

Ключом к технике массового масштабирования шаблона Comet является использование HTTP-слушателей Java NIO в сочетании с пулом потоков (например, класс Executor в библиотеке параллелизма Java 5). Servlet 3.0 - это асинхронная управляемая событиями модель для сервлетов, которая может быть связана с таким прослушивателем HTTP. Тысячи (числа от 10 000 до 20 000) одновременных соединений Comet могут поддерживаться на одном физическом сервере.

Хотя в нашем случае мы используем технологию Adobe Flex, чтобы превратить веб-клиентов в подписчиков на обмен сообщениями по событиям, то же самое можно сделать для любого стандартного веб-приложения AJAX. В кругах AJAX технику выполнения push-сообщений на стороне сервера часто называют Reverse AJAX . Возможно, вы заметили, что Comet - игра слов, как в аналоге Ajax (оба уборщика по дому). Хорошая вещь для нас, однако, это то, что мы просто соединяем наши кусочки и уходим. У общих веб-кодеров AJAX будет гораздо больше работы по программированию. (Тем не менее, даже стандартное веб-приложение может играть с BlazeDS - оно просто не будет иметь никакого смысла для маршалинга AMF, на который способен BlazeDS.)

Наконец, Adobe и SpringSource сотрудничают в создании более плавной, готовой интеграции BlazeDS в сочетании со Spring-Framework:

Adobe сотрудничает с SpringSource для расширенной интеграции между платформами Flash и SpringSource

6 голосов
/ 28 декабря 2008

Прежде всего, не беспокойтесь о ESB. Описанная вами ситуация хорошо укладывается в рамки простого промежуточного программного обеспечения, ориентированного на сообщения. Вы только «нуждаетесь» в ESB, если вы делаете такие вещи, как посредничество, маршрутизация на основе контента, преобразования протокола; вещи, где промежуточное программное обеспечение делает сообщение к сообщению, помимо направления его в нужное место.

Если у вас есть разнообразный набор приложений-адресатов, которым необходимо общаться друг с другом - и это звучит так же, как и вы - вы правы, что обмениваетесь сообщениями по протоколу, независимому от языка (например, XMPP, STOMP HTTP) это аккуратное решение. По сути, это означает, что вам не нужно писать и запускать множество Java-демонов, чтобы переводить сообщения в ваш любимый вариант JMS.

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

Для меня XMPP - слабоватый вариант, так как он не очень хорошо поддерживается на стороне сервера, хотя интересно иметь возможность обмениваться мгновенными сообщениями с вашим брокером:)

Если вы настроены на HTTP, OpenMQ очень хорош, и я лично использовал его Universal Message Service - в основном, оболочку веб-приложения вокруг JMS-адресов. Он предоставляет интерфейс REST-ful с таким же набором глаголов, что и STOMP.

4 голосов
/ 04 августа 2011

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

RabbitMQ разработан в Erlang, но у него есть клиенты java, net, python и т. Д., Которые могут подключиться к нему очень легко. Я использовал клиенты .net и python, это хорошо работает. Я выбрал его для репутации Эрланга за создание надежных систем, которые могут очень хорошо справляться с множеством вещей одновременно. Я бы назвал их потоками, но я думаю, что это умнее, чем просто потоки, я помню, как бормотали модель актера и почтовые ящики, которые, как я помню, были довольно аккуратными.

Я был в том же положении, что и вы, но с очень плохим опытом других систем обмена сообщениями (Biztalk и др.), Которые были слишком приличными, что связывало вас с решением. Если вы можете хранить сообщения отдельно от механизмов транспортировки и доставки, то вы можете развить свою систему до своего сердца. В конце концов, я использовал JSON, так как размеры пакетов невелики. Вы можете использовать все, что захотите, некоторые выбирают SOAP-сообщения, но я чувствую, что они слишком тяжелы для большинства вещей, хотя это позволяет вам приятно отдавать XSD-схемы посторонним, чтобы они могли / могли разрабатывать системы, которые взаимодействуют с вашими Система в будущем.

http://www.rabbitmq.com/tutorials/tutorial-three-java.html, это ссылка на учебник по модели публикации / подписки и того, как вы этого добьетесь, используя систему очереди сообщений. Это для rabbitMQ, но, честно говоря, он будет работать с ESB и любой другой системой очереди сообщений.

1 голос
/ 15 июля 2016

ESB (Enterprise Serial Bus) - учитывайте это, когда ваше приложение сильно взаимодействует с двумя или более внешними / отдельными приложениями, где каждое из них не будет взаимодействовать в сходном формате данных. Пример: некоторые системы могут принимать объекты, XML, JSON, SMTP, TCP / IP, HTTP, HTTPS и т. Д.

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

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

Веб-службы (SOAP / REST) ​​лучше всего подходят, если одному приложению требуется другое приложение для завершения рабочего процесса. Используйте Очереди, если приложению требуется асинхронная передача данных.

0 голосов
/ 15 июля 2016

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

Само программное обеспечение ESB отнимает много времени и требует обслуживания. Если вы перейдете к решению с открытым исходным кодом, это может занять больше времени, чем использование лицензионного решения (IBM, ORACLE, ...).

Конечно, ESB справился бы с работой, и было бы действительно легко разработать решение, но настроить ESB было бы намного сложнее, чем само решение.

Если ваша проблема ограничена описанным случаем, я настоятельно рекомендую вам создать простую архитектуру через OpenMQ (или аналогичную) и использовать ее через JMS

0 голосов
/ 14 апреля 2011

Вы действительно говорите о публикации и подписке с гарантированной доставкой. Большинство программ MOM должно легко поддерживать ваш вариант использования.

...