单个 java 进程的队列/工作线程架构
Posted
技术标签:
【中文标题】单个 java 进程的队列/工作线程架构【英文标题】:Queuing / Worker Thread architecture for a single java process 【发布时间】:2012-10-13 18:45:09 【问题描述】:我有以下问题要解决。
我需要编写一个java程序:
-
从 Web 服务读取 JSON 对象 j1,j2,...,jn。
对每个对象进行一些数字运算以得出 j1',j2',...,jn'
将对象 j1',j2',...,jn' 发送到 Web 服务。
步骤 1、2 和 3 的计算、空间要求可能随时变化。
例如:
-
在第 2 步处理 JSON 对象所需的时间可能因 JSON 对象的内容而异。
Web 服务在第 1 步中生成对象的速率可以随时间上升或下降。
第 3 步中的消费网络服务可能会积压。
为了解决上述设计问题,希望实现以下架构:
-
从外部 Web 服务读取 JSON 对象并将它们放在 Q 上
一个自动调整大小的工作线程池,它使用来自 Q 的 JSON 对象并对其进行处理。处理它们后,将生成的对象放在第二个 Q
一个自动调整大小的工作线程池,它使用来自第二个 Q 的 JSON 对象以将它们发送到使用 Web 服务。
问题:
我很好奇是否有可以用来解决这个问题的框架?
注意事项:
-
我可以使用一系列组件(例如自定义队列、使用并发包的线程池)来解决此问题,但我正在寻找一种允许编写此类解决方案的解决方案。
这不会存在于容器中。这将是一个 Java 进程,其入口点是 public static void main(String args[])
但是,如果有适合此范例的容器,我想了解一下。
我可以将其拆分为多个进程,但我希望将其保持在一个进程中非常简单。
谢谢。
谢谢。
【问题讨论】:
对不起……一定是我的大脑疲倦了。 【参考方案1】:尝试Apache camel 或Spring Integration 进行连接。这些是一种集成框架,将简化您与 Web 服务的交互。您需要做的是从 webservice 1 -> number cruncher -> web service 2 定义一个 route。两者之间所需的路由和转换可以由框架本身处理
您可以将您的 cruncher 实现为骆驼处理器。 可以通过SEDA 实现并行化您的运算器; Camel 有一个用于this pattern 的组件。另一个替代品是AsyncProcessor
我想说你先看看像骆驼这样的框架背后的原则。他们创建的抽象与手头的问题非常相关。
【讨论】:
嗯,@mzzzzb,你认为 Twitter Storm 是否符合要求? @user1172468,恐怕我对 Storm 一无所知。只是看着它,似乎很有趣,无法提供建议。还有一件事要学:)【参考方案2】:我不确定你的帖子的最终问题是什么,但你有一个合理的设计理念。我要问你的一个问题是你在什么环境中?您是在 JavaEE 容器中还是只是一个简单的独立应用程序?
如果您在一个容器中,让消息驱动 Bean 处理 JMS 队列比拥有一个工作线程池更有意义。
如果在您自己的容器中,您自己管理线程池会更有意义。话虽如此,我还会考虑运行单独的应用程序,将工作从队列中拉出来,这将为您带来更好的扩展架构。如果需要,您可以添加更多机器,让更多工作人员指向一个队列。
【讨论】:
非常感谢@Jeff 我将根据您的输入编辑问题并对其进行优化,但基本上:1. 没有容器 2. 想要保留很简单:一个过程 据我所知,没有任何一站式商店框架,但您可以将几个链接在一起。您可以使用 Apache Axis 等框架来消费和推送到 Web 服务,并使用 Apache Commons Pooling 来池化线程并自动增长。以上是关于单个 java 进程的队列/工作线程架构的主要内容,如果未能解决你的问题,请参考以下文章