jms:队列与seda:在Apache Camel中

Arc*_*her 3 apache-camel

我已经构建了重型线程应用程序,它从网络接收网页并执行HTML的深入处理.基本上我的所有线程都包含许多网络绑定操作和CPU绑定操作.我在不同的线程中运行它们(所以我实现了大多数IO/CPU利用率).

由于有数百万个URL需要处理,我无法运行seda:coz和Camel 2.3一样,默认情况下它的大小是无限的,并且在一段时间内我的内存不足.我可以严格限制seda队列的大小,但我决定不这样做,而是使用JMS队列.

在相同数量的线程上,我看到使用jprofiler8的线程遥测的不同结果.请检查区别:

在此输入图像描述

任何人都可以解释一下为什么我在使用seda时有更好的IO利用率:队列与jms相比:1?

Pet*_*der 6

您的方案有点不清楚.

SEDA是一个将BlockingQueue中的 Exchange排队/出列的包装器.全部在内存中,在VM操作中.

JMS队列只是某些MOM服务器实现(Apache ActiveMQ,Apache Qpid或IBM WebSphere MQ等)的API抽象.但是,由于JMS队列是通过TCP/IP上的有线协议和事务一起构建的,因此持久性与复杂功能(如选择器)一起使用 - 运行时服务器资源上的特性当然与SEDA实现不同.具体如何以及为什么在很大程度上取决于您使用的各种选项和特定JMS产品以及许多其他难以预测的因素.

我建议你将Camel库更新到更高版本,在那里你可以控制SEDA队列大小并在生成时阻止生成器.