3

我已经构建了从网络接收网页并执行 HTML 深度处理的重线程应用程序。基本上我所有的线程都由许多网络绑定操作和 CPU 绑定操作组成。我在单独的线程中运行它们(因此我实现了大多数 IO/CPU 利用率)。

由于要处理数百万个 URL,我无法运行 seda: 因为对于 Camel 2.3,它的大小默认情况下是无限的,有时我会耗尽内存。我可以严格限制 seda 队列的大小,但我决定不这样做,而是使用 JMS 队列。

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

在此处输入图像描述

谁能解释我为什么在使用 seda 时我的 IO 利用率要好得多:与 jms 相比:队列?

4

1 回答 1

6

你的情况有点不清楚。

SEDA 只是一个从BlockingQueue入队/出队交换的包装器。全部在内存中,在 VM 操作中。

JMS 队列只是对某些 MOM 服务器实现(Apache ActiveMQ、Apache Qpid 或 IBM WebSphere MQ 等)的 API 抽象。然而,由于 JMS 队列被构建为通过 TCP/IP 上的有线协议与事务、持久性以及诸如选择器之类的复杂特性一起使用——运行时服务器资源的特性当然与 SEDA 实现不同。确切的方式和原因在很大程度上取决于各种选项和您使用的特定 JMS 产品以及许多其他难以预测的因素。

我建议您将 Camel 库更新到更高版本,在该版本中您可以控制 SEDA 队列大小和满时的块生产者。

于 2013-09-13T19:04:55.213 回答