2013-09-13 3 views
3

Я создал приложение с большой резьбой, которое получает веб-страницы из сети и выполняет глубокую обработку HTML. В основном все мои потоки состоят из множества операций с привязкой к сети и операций с привязкой к ЦП. Я запускаю их в отдельных потоках (так что я добился большей загрузки IO/CPU).jms: queues vs seda: in Apache Camel

Поскольку есть миллионы URL-адресов для обработки, я не могу запускать seda: coz, так как для Camel 2.3 размер по умолчанию неограничен, и через некоторое время у меня закончилась нехватка памяти. Я могу строго ограничить размер очередей seda, но я решил не делать этого, но вместо этого используйте очереди JMS.

На том же числе потоков я вижу разные результаты телеметрии нитей с использованием jprofiler8. Пожалуйста, проверьте разницу:

enter image description here

Может кто-нибудь объяснить мне, почему у меня есть гораздо более эффективное использование IO при использовании Седа: очереди по сравнению с JMS: одни?

ответ

6

Ваш сценарий немного неясен.

SEDA - это обертка для размещения в очереди/dequeue. Обменный код от BlockingQueue. Все в памяти, в операциях VM.

Очередь JMS представляет собой абстракцию API через некоторую реализацию сервера MOM (Apache ActiveMQ, Apache Qpid или IBM WebSphere MQ и т. Д.). Однако, поскольку очереди JMS построены для использования по проводному протоколу через TCP/IP вместе с транзакциями, настойчивость вместе со сложными функциями, такими как селекторы, характеристики на ресурсах сервера во время выполнения, конечно, будут отличаться от реализации SEDA. Точно как и почему многое зависит от различных опций и конкретного продукта JMS, который вы используете вместе с множеством других трудно прогнозируемых факторов.

Я предлагаю вам обновить ваши библиотеки Camel до более поздней версии, где вы можете контролировать размер очереди SEDA и блокировать производителей, когда они полны.

+0

Когда я использую компонент camel-jms, мне не нужно указывать реализацию сервера MOM (ActiveMQ, Qpid, любой другой MQ). Он работает из коробки, поэтому я думаю, что он использует некоторую простую внутреннюю реализацию MQ. Мой вопрос заключался в том, что очередь SEDA в режиме «все в памяти» работает намного быстрее/оптимальнее, чем этот простой MQ-модуль, который распространяется вместе с компонентом camel-jms. – Archer

+0

Поверь мне. В camel-jms нет волшебной реализации MQ. Это полностью основано на Spring JMS, которая является клиентской средой для JMS. Вероятно, у вас есть встроенная реализация ActiveMQ под капотом. Все еще то, что я сказал выше, все еще имеет место. Реализации JMS намного сложнее, чем простая очередь. –

+0

Спасибо за ваш ответ. У меня действительно есть ActiveMQ, который я явно не настроил для этих jms. Я попытаюсь исключить его и посмотреть, что произойдет. – Archer

Смежные вопросы