Потенциальные ловушки в использовании очереди JMS?

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

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

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

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

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

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

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

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

13
задан user256447 30 January 2010 в 02:32
поделиться

2 ответа

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

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

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

7
ответ дан 2 December 2019 в 01:21
поделиться

Скорость. Если поле устанавливается или считывается миллиарды раз в ходе моделирования, то необходимо использовать поле, а не свойство, чтобы избежать служебного вызова подпрограммы. По мере возможности, в соответствии с OO (DDD?), в этих случаях я бы рекомендовал прибегать к полям только в классе, посвященном представлению какой-то «ценности», как человек. Логика должна быть сведена к минимуму. Скорее, иметь персонального или персонсерватора.

Но если у вас есть эти проблемы, то вы, вероятно, не программируете c++ и не c #, не так ли?

-121--1255489-

Используйте команду svn switch с параметром командной строки --relocate .

-121--810528-

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

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

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

3
ответ дан 2 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: