Потенциальные ловушки в использовании очереди JMS? - PullRequest
13 голосов
/ 30 января 2010

Меня попросили спроектировать и внедрить систему для получения большого объема данных автоматизированного датчика с большого количества устройств. Эти данные будут создаваться через регулярные промежутки времени и отправляться на сервер в виде XML в сообщении http. Устройства будут повторно отправлять одни и те же данные, если они не получат определенного подтверждения от сервера. Некоторая потенциально тяжелая обработка этих данных должна произойти до того, как они будут вставлены в ряд таблиц в основной базе данных посредством транзакции, и, кроме того, некоторые точки данных должны быть поставлены в очередь для перенаправления на другие внешние URL-адреса.

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

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

2) Используйте решение JMS на основе базы данных для реализации очередей.

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

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

Целостность данных - это большая проблема, поэтому мне нужно убедиться, что JMS не сможет гарантировать потерю данных в случае перезагрузки сервера, отключения питания или если по какой-либо причине очередь становится очень большой. Например, может ли проблема завершения транзакций с основной базой данных в течение определенного периода времени привести к нехватке памяти JVM, сбоям и потере всех накопленных данных? (Это будет кошмарный сценарий).

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

Ответы [ 3 ]

7 голосов
/ 30 января 2010

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

  • Не все реализации JMS одинаковы. Теоретически вы можете использовать любую реализацию, которая соответствует вашим потребностям, но если вы не готовы к серьезному нагрузочному тестированию и тестированию состояния отказа, вы не можете знать, что конкретная реализация не потерпит неудачу в вашем конкретном случае использования.
  • Большинство JMS используют транзакционное хранилище данных, такое как реляционная база данных, в качестве своей внутренней части. Это означает, что вместо прямой записи в любое хранилище данных, с которым вы знакомы, вы должны полагаться на дополнительный уровень реализации JMS между вами и этими сохраненными сообщениями.
  • Хотя обмен реализациями JMS с целью найти ту, которая идеально соответствует вашим потребностям, может показаться простым делом из-за однородного API JMS, критических функций для обработки сбоев, мониторинга сервера JMS и всех других интересных вещей, которые существуют выше если вы действительно измените свою реализацию, вам придется столкнуться с проблемой не только обмена сообщениями.

Тем не менее, я думаю, что вы с ума сошли бы, написав в БД самостоятельно, вместо того, чтобы переходить на JMS. Во-первых, ActiveMQ - почтенный сервер JMS, используемый во многих корпоративных средах. Во-вторых, дело в том, что вы просто сами напишете этот дополнительный слой для реализации обмена сообщениями, и ваш код не будет иметь преимущества тысяч глаз (или набора платных разработчиков, единственная работа которого это отвечать на запросы клиентов и убедиться, что реализация JMS надежна). Что касается третьего пункта, то же самое относится и к хранилищу данных вашего бэкенда. Используйте JMS, вы избавите себя от неприятностей в долгосрочной перспективе.

3 голосов
/ 30 января 2010

Если вы хотите пойти по JMS-пути, хорошим выбором будет автономный JMS-совместимый брокер сообщений (отдельно от вашего сервера приложений). Брокеры сообщений варьируются от бесплатного открытого исходного кода (например, ActiveMQ на http://activemq.apache.org/ или OpenMQ на https://mq.dev.java.net/), до крупномасштабных коммерческих решений (IBM WebSphere MQ на http://www -01.ibm.com). / программное обеспечение / интеграция / WMQ / является одним из крупнейших).

Брокеры сообщений предлагают гарантированную доставку (при условии, что сервер включен и прослушивается), и вы можете сделать немало, чтобы обеспечить отказоустойчивость системы, включая встроенные серверы резервного копирования и мгновенное резервное копирование питания. Очереди посредника могут в конечном итоге исчерпать пространство, если сервер приложений не принимает сообщения, но вы можете назначить огромную глубину очереди (100 ГБ) и заставить сервер отправлять оповещения, если сообщения не обрабатываются и очередь достигает определенный процент.

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

0 голосов
/ 14 марта 2018

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

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

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

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

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

...