单个 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 进程的队列/工作线程架构的主要内容,如果未能解决你的问题,请参考以下文章

在子进程运行和通信时终止子进程,这些子进程通过队列干净地通信

进程队列补充socket实现服务器并发线程完结

线程,进程 ,队列 基本用法总结

线程,进程 ,队列 基本用法总结

工作队列可以被中断吗

laravel 队列 - 同步驱动程序如何工作?它是在单独的进程/线程还是主执行线程中执行?