Как JMS Receive работает внутри?
Я изучал различные коммуникационные технологии/архитектуры/шаблоны/реализации (читал: buzzwords), включая веб-службы (WCF, Axis2), ESB, SOA и хотел узнать больше о JMS в отношении обмена сообщениями.
Концептуально JMS звучит просто. Я считаю, что это промежуточный брокер, который управляет сообщениями издателей и направляет их соответствующим подписчикам. Это делается путем отправки сообщений в очередь, когда они публикуются, и отбрасывая их по мере их получения.
Вопрос 1: Правильно ли мое основное понимание JMS?
Одна из вещей, которая вызывает у меня ошибки при чтении технологий, - это когда определен определенный уровень (преднамеренный или непреднамеренный) размахивание рук по поводу функции.
Основываясь на моем основном понимании, должен быть запущен JMS-провайдер для отправки или получения сообщений. Мое предположение о публикации заключается в том, что поставщик JMS просто ждет, пока сообщение опубликовано, а затем сохранит его в очереди (память или поддержка базы данных, в зависимости от реализации). Однако я не совсем уверен, как работает прием.
Вопрос 2: Принимает ли (обычно) блок, если сообщения не доступны?
Вопрос 2b: Если да, то как достигается блокировка? Клиент постоянно проводит опрос сообщений? Сервер просто не отвечает до опубликования сообщения (как это работает без тайм-аута?) Позволяет ли провайдер инициировать вызов получателю?
Вопрос 2c: Если нет, как обеспечить своевременное получение сообщений, не влияя на производительность?
Основное описание, похоже, склоняется к одному провайдеру JMS, чтобы гарантировать, что сообщения централизованно не потеряны. Я вижу, что масштабирование является проблемой.
Вопрос 3: Как шкала JMS?
При масштабировании я вижу, что существуют сложности, обеспечивающие доставку одного сообщения всем соответствующим подписчикам, независимо от того, какой физический сервер получает сообщение.
Вопрос 3b: Как реализация JMS обеспечивает надежную доставку в масштабированной среде?
Обратите внимание, что хотя эти вопросы связаны с JMS, они, вероятно, относятся к любой инфраструктуре обмена сообщениями. Я приветствую ответы, характерные для JMS, а также те, которые являются более общими или даже конкретными для другой технологии.
Ответы
Ответ 1
Я пытаюсь ответить на несколько вопросов, основываясь на моем опыте в JMS.
Ответ 1: - JMS - это Java Message Service API; он обеспечивает единообразный интерфейс для клиентов Java для доступа к инфраструктуре обмена сообщениями. Под JMS API является JMS-совместимым поставщиком сообщений, например, поставщиком WebSphere MQ.
JMS поддерживает передачу полезной нагрузки по любому протоколу обмена сообщениями в пункты назначения, а именно: Очередь и тема.
Это основы JMS.
Как получить работу?
Спецификация JMS предоставляет два важных класса: - MessageConsumer
и MessageListener
. MessageConsumer
позволяет JMS-клиенту синхронно получать JMS-сообщения, вызывая любой из его методов receive()
. Этот вызов будет блокировать поток до тех пор, пока сообщение не будет получено.
В противном случае асинхронный прием может быть выполнен путем регистрации объекта MessageListener
с помощью MessageConsumer
.
Именно JMSProvider узнает, что сообщение отправлено в его местное место назначения, и его задача состоит в том, чтобы доставлять сообщения либо в поток потребительского потока опроса, либо в поток опроса зарегистрированных пользователей без опроса.
Ответ 2: -
MessageConsumer
API имеет два варианта приема: receive()
и receive(long timeout)
. Последний вариант позволяет блоку потока MessageConsumer
до тех пор, пока сообщение не поступит в течение определенного периода времени ожидания или не истечет время ожидания.
Различные платформы обмена сообщениями могут реализовывать функцию блокировки по-разному. Поскольку объекты JMS являются управляемыми JNDI объектами, а объекты-прокси-провайдеры возвращаются клиенту JMS, это означает, что клиент не знает, как происходит блокирование в фоновом режиме. Конкретная среда обмена сообщениями может выбирать опрос потребительских потоков сообщений через определенный период времени. В качестве альтернативы он может блокироваться до отправки уведомления.
Я не уверен, что вы ищете ответ для конкретной системы обмена сообщениями, совместимой с JMS?
Ответ 3: -
На мой взгляд, благодаря масштабированию JMS вы имеете в виду способность иметь много издателей/подписчиков, множество пунктов назначения на нескольких физических машинах. Для масштабирования JMS требуется поддержка основного поставщика сообщений для поддержки какой-либо кластеризации/сбоя. Поскольку такая спецификация JMS не поддерживает масштабируемость. Поправьте меня, если я ошибаюсь в этом? Например, я работал над совместимым с JMS WebSphere MQ, который обеспечивает поддержку кластеризации.
Ответ 2
Вопрос 1: Правильно ли мое основное понимание JMS?
Позвольте сначала получить термины справа. Вы не можете сказать JMS Provider must be running
, потому что поставщик - это сущность, которая построила JMS-сервер, и это должен быть JMS-сервер. Следовательно, когда мы говорим JMS, мы имеем в виду набор API (более технически - интерфейсы), которые реализуют провайдеры. Таким образом, в основном провайдеры пишут собственную реализацию JMS. Например, Active MQ is a JMS server
, предоставляемый Apache(provider)
Мое предположение о публикации заключается в том, что поставщик JMS просто ждет, пока сообщение опубликовано, а затем сохранит его в очереди (память или поддержка базы данных, в зависимости от реализации).
Правда в некоторой степени. Существуют различные модели, которые следуют. Сервер JMS поддерживает открытие сокета. Когда клиент отправителя должен отправлять сообщение, он просто открывает соединение с сокетом и отправляет сообщение. Как получается поведение ведет себя совершенно иначе. У вас тянуть и нажмите. В push-сервере будут нажимать сообщения прямому получателю, как только он получит сообщение. Это также называется асинхронным режимом. В модели pull клиент-клиент отправляет запрос на сервер для получения сообщений (синхронный режим).
Получает (обычно) блок, если сообщения не доступны?
Как я уже упоминал в предыдущем пункте, это будет зависеть от модели, которую вы используете. Приемник будет заблокирован в модели pull (синхронный прием). Также это происходит в сеансе, а не в основном потоке.
Если да, то как достигается блокировка? Постоянно ли выполняется опрос клиентов для сообщений?
Да, клиент будет проводить постоянный опрос в случае модели pull. Как правило, есть тайм-аут, после которого клиент будет завершен.
Если нет, то как обеспечить своевременное получение сообщений, не влияя на производительность?
Используйте асинхронный режим. Вам просто нужно зарегистрировать MessageListener, и он получит сообщение об этом переопределенном onMessage (Message msg) при наличии сообщений на сервере.
Вопрос 3: Как масштабируется шкала JMS?
Это действительно вопрос, о котором беспокоиться провайдеры. Когда вы говорите, что все абоненты получают сообщение, вы ссылаетесь на модель связи PUBSUB (другое - PTP). В сообщении PUBSUB, отправленном на эту тему, будут доставлены все подписчики, подписавшиеся на эту тему.
Вопрос 3b: Как реализация JMS обеспечивает надежную доставку в масштабированной среде?
Надежность? Не всегда. Опять же, это зависит от варианта использования. У вас может быть постоянный, а также непостоянные сообщения. В случае постоянных сообщений сообщения хранятся в БД (файл или другие), и обеспечивается доставка. В случае непостоянных сообщений такой гарантии нет. Сбой сервера может привести к потере сообщений.
Ответ 3
Распространение сообщений службы JMS с помощью синхронного метода (получение с и без тайм-аута блокировки вашего потока) или связанный с событием обратный вызов (асинхронный прослушиватель сообщений)).
Вы можете решить, какой метод лучше соответствует вашим потребностям, но вам также может потребоваться взглянуть на фактическую реализацию. Например, некоторые реализации JMS делают кругооборот в сети для приема() и поэтому лучше используются с тайм-аутом или с прослушивателем.
С поведением прослушивателя сообщения и приостановкой приема сообщения не так легко управляются, как с блокирующим приемом приема. Обычно большинство контроля достигается за счет наличия собственного пула блокирующих вызовов приема() с тайм-аутами, отправки вашим работникам.
Ответ 4
Я думаю, что следует отметить разницу между Queue и Topic, поскольку существуют важные различия в способах доставки сообщений.
Очередь: только один клиент получит сообщение. Чтобы уменьшить масштаб, вы можете, например, подключить 10 клиентов к одной очереди, но только один из них получит конкретное сообщение. Если клиенты не подключены, сообщение останется в очереди до тех пор, пока кто-нибудь не подключится или сообщение не выйдет.
Тема: все клиенты получат копию каждого сообщения. Обычно используется в сценарии абонента, где многие конечные точки потенциально заинтересованы в каждом сообщении. Долговечный абонент может даже немного опуститься; сообщение будет сохранено до тех пор, пока абонент не встанет снова или сообщение не выйдет из строя. Если клиенты не подключены, и нет надежных подписчиков, сообщение будет удалено.
Ответ 5
В JMS существует два типа доменов обмена сообщениями.
- P oint- T o- P oint (PTP) Домен объявлений
- Домены для издателей/подписчиков
В модели PTP одно сообщение доставляется только на один приемник. Здесь Queue используется как M essage O ориентированный M iddleware (MOM).
Очередь несет ответственность за сообщение, пока приемник не будет готов.
В модели PTP отсутствует зависимость времени между отправителем и получателем.
![введите описание изображения здесь]()
В модели Pub/Sub одно сообщение доставляется всем подписчикам. Это похоже на вещание. Здесь Topic используется как ориентированное на сообщение промежуточное программное обеспечение, которое отвечает за хранение и доставку сообщений.
В модели PTP существует зависимость времени между издателем и подписчиком.
![введите описание изображения здесь]()
Модель программирования JMS
![введите описание изображения здесь]()
источник
M essage D riven B ean (MDB)
- MDB - это bean, который содержит бизнес-логику. Но он вызывается передачей сообщения. Итак, это похоже на JMS Receiver.
- MDB асинхронно получает сообщение и обрабатывает его.
- MDB получает сообщение из очереди или темы.
- MDB похож на сеанс без состояния bean, который инкапсулирует бизнес-логику и не поддерживает состояние bean.
![введите описание изображения здесь]()