Apache Camel 是否适合与专有作业处理应用程序集成?
Is Apache Camel suitable to integrate with a proprietary job processing application?
在当前项目中,我们需要运行 对从我们系统导出的数据进行一些相当复杂的计算。计算由第三方软件处理(对我们来说基本上是一个黑匣子)。我们将此软件作为 Linux 或 Windows 二进制文件,并且知道如何在命令行中使用我们的数据执行它。
在一个 CPU 核心上处理单个数据集大约需要 200 小时。但是,我们可以将数据集拆分为更小的数据集(结构上等效)和并行 运行 计算。稍后,我们可以轻松汇总结果。
我们的目标是能够在 10 小时内处理每个数据集。
我们的客户拥有专有的作业处理应用程序。该接口是基于文件系统的:我们将作业的 EXE 文件(是的,它是 Windows 支持的)和配置 INI 文件复制到传入文件夹,作业处理应用程序在其中一个节点上执行该作业(处理错误、故障转移等),最后将结果复制到传出文件夹。这个专有的作业处理系统有数百个 CPU 核心,因此显然有足够的能力在 10 小时内处理我们的数据集。甚至不到 30 分钟。
现在,问题是,到目前为止,我们的应用程序是基于 J2EE 的或多或少的标准 JBoss 应用程序。我们需要:
- 与专有的类似队列的作业处理系统集成,并且
- split/aggregate 我们的数据集以可靠的方式呈现。
对我来说,我们必须做的许多部分看起来与 Enterprise Application Intergation Patterns like Splitter and Aggregator. So I was thinking if Apache Camel 非常相似,非常适合实施:
- 我们将以消息的形式构建我们的作业(EXE + INI + 数据集)。
- 拆分器通过将数据集分成几个较小的数据集,将较大的作业消息分成较小的作业消息。
- 我们可能需要实现自己的消息通道,以将消息写入传入目录或从专有作业处理系统的传出目录读取消息。
- 我们需要一个聚合器来将作业部分的结果聚合到作业的一个结果中。
但是,我还没有使用 Apache Camel 的经验,所以我决定就适用性征求意见。
鉴于上述问题,您认为 Apache Camel 是否适合该任务?
结束语:我不是在寻找外部资源或 tool/library 建议。如果我在 Apache Camel 的正确轨道上,只是一个确认(或相反)。
你那边的用例相当复杂。让我以简单的格式重新表述您想做的事情并提供我的想法。如果你看到我想念什么,请给我留言,我会修改我的 post.
JBoss 基于 J2EE 的应用程序,它有一个大型数据集,需要将其拆分成更小的部分,然后再转换为自定义格式。然后,此格式将被写入磁盘并由另一个应用程序处理,该应用程序将在磁盘上的输出文件夹中创建新的数据结果。然后您想要获取此输出并汇总结果。
我会说 apache camel 可以做到这一点,但您将不得不花时间根据您的需要正确调整系统并在您的组件上设置一些自定义配置。我想象这个过程看起来像:
from("my initial data source")
.split().method(CustomBean.class, "customSplitMethod")
//You might want some sort of round robin pattern to
//distribute between the different directories
.to("file://customProgramInputDirectory");
from("file://customProgramOutputDirectory")
.aggregate(constant(true), new MyCustomAggregationStratedgy())
.to("output of your data source");
既然你说你将与一个 "proprietary queue-like job processing system" 集成,我可能误解了另一个程序的输入和输出是文件目录,如果它是一个基于队列的系统并且它支持 jms 有一个您可以使用通用模板,如果不是,它总是可以创建自定义骆驼组件,这样您的模式就会从说 'file://' 变为 'MyCustomEndpoint://'
答案是否定的 - Camel 不是最好的框架,即使它可以扩展以模仿您描述的内容。
Apache Camel 确实在传入的统一工作标识为 Exchange
时执行一些拆分,这当然可以是一个文件(使用骆驼文件组件)。但是,在拆分时,每个 "chunk" 然后被发送到一个专用的 Processor
。
问题是块本身是一个 Exchange
并且意味着要放在内存中(以便以后能够并行执行任务)。在你的情况下,我假设这部分数据仍然太大而无法在内存中处理。如果没有,Camel 会满足您的需求,甚至执行与您描述的系统集成所需的所有轮询。
你要求不要提出任何建议,但如果我是你,我会尝试 Spring Batch。
我认为 Apache Camel 适合您的需求,因为它是迄今为止我发现的最好的集成框架之一。
我现在的项目涉及ECM处理,需要处理大量文档,可能达到1个million/day。
作为输入,我们有 XML 个代表一组文档(或大量文档)的文件以及指向存储在 NAS 上的真实文件的链接。
首先,我们必须将所有这些 XML 文件转换为专有 XML 格式,这种格式适用于我们的 ECM 系统(我们的黑盒)使用的专有文档导入器,并将它们拆分为更小的部分,以便利用多个导入队列。
然后我们必须监控导入器队列并正确调度它们以平衡队列负载,在该操作之后我们必须找出从输出专有格式 XML 文件中读取的操作结果由进口商生成。
在此过程的每一步之间都有一个 ActiveMQ 队列(具有数据库持久性),以保持所有异步和每个阶段
可以扩大规模,增加该特定队列上的并发消费者数量。
此外,我们的微服务是由 ESB 管理的庞大而冗长的工作流的一部分,因此我们从 ESB 提供的队列获取输入消息并写入输出消息
再次回到这些队列,使用小型 Web 服务 get/set 对象。
我们决定选择 Camel,因为它解决了许多集成问题,它可以完全控制每条路线,并且可以通过 hawtio 轻松监控。
此外,大部分配置都是通过编写或修改 xml 上下文文件来完成的,这为您提供了灵活性并避免了编写大量代码。
社区很活跃,框架更新很频繁,你可以找到很多书籍和教程。
所以我认为你的问题与我的项目目标相比有很多联系点和亲和力,所以我还是决定使用Apache Camel。
效果很好。
在当前项目中,我们需要运行 对从我们系统导出的数据进行一些相当复杂的计算。计算由第三方软件处理(对我们来说基本上是一个黑匣子)。我们将此软件作为 Linux 或 Windows 二进制文件,并且知道如何在命令行中使用我们的数据执行它。
在一个 CPU 核心上处理单个数据集大约需要 200 小时。但是,我们可以将数据集拆分为更小的数据集(结构上等效)和并行 运行 计算。稍后,我们可以轻松汇总结果。 我们的目标是能够在 10 小时内处理每个数据集。
我们的客户拥有专有的作业处理应用程序。该接口是基于文件系统的:我们将作业的 EXE 文件(是的,它是 Windows 支持的)和配置 INI 文件复制到传入文件夹,作业处理应用程序在其中一个节点上执行该作业(处理错误、故障转移等),最后将结果复制到传出文件夹。这个专有的作业处理系统有数百个 CPU 核心,因此显然有足够的能力在 10 小时内处理我们的数据集。甚至不到 30 分钟。
现在,问题是,到目前为止,我们的应用程序是基于 J2EE 的或多或少的标准 JBoss 应用程序。我们需要:
- 与专有的类似队列的作业处理系统集成,并且
- split/aggregate 我们的数据集以可靠的方式呈现。
对我来说,我们必须做的许多部分看起来与 Enterprise Application Intergation Patterns like Splitter and Aggregator. So I was thinking if Apache Camel 非常相似,非常适合实施:
- 我们将以消息的形式构建我们的作业(EXE + INI + 数据集)。
- 拆分器通过将数据集分成几个较小的数据集,将较大的作业消息分成较小的作业消息。
- 我们可能需要实现自己的消息通道,以将消息写入传入目录或从专有作业处理系统的传出目录读取消息。
- 我们需要一个聚合器来将作业部分的结果聚合到作业的一个结果中。
但是,我还没有使用 Apache Camel 的经验,所以我决定就适用性征求意见。
鉴于上述问题,您认为 Apache Camel 是否适合该任务?
结束语:我不是在寻找外部资源或 tool/library 建议。如果我在 Apache Camel 的正确轨道上,只是一个确认(或相反)。
你那边的用例相当复杂。让我以简单的格式重新表述您想做的事情并提供我的想法。如果你看到我想念什么,请给我留言,我会修改我的 post.
JBoss 基于 J2EE 的应用程序,它有一个大型数据集,需要将其拆分成更小的部分,然后再转换为自定义格式。然后,此格式将被写入磁盘并由另一个应用程序处理,该应用程序将在磁盘上的输出文件夹中创建新的数据结果。然后您想要获取此输出并汇总结果。
我会说 apache camel 可以做到这一点,但您将不得不花时间根据您的需要正确调整系统并在您的组件上设置一些自定义配置。我想象这个过程看起来像:
from("my initial data source")
.split().method(CustomBean.class, "customSplitMethod")
//You might want some sort of round robin pattern to
//distribute between the different directories
.to("file://customProgramInputDirectory");
from("file://customProgramOutputDirectory")
.aggregate(constant(true), new MyCustomAggregationStratedgy())
.to("output of your data source");
既然你说你将与一个 "proprietary queue-like job processing system" 集成,我可能误解了另一个程序的输入和输出是文件目录,如果它是一个基于队列的系统并且它支持 jms 有一个您可以使用通用模板,如果不是,它总是可以创建自定义骆驼组件,这样您的模式就会从说 'file://' 变为 'MyCustomEndpoint://'
答案是否定的 - Camel 不是最好的框架,即使它可以扩展以模仿您描述的内容。
Apache Camel 确实在传入的统一工作标识为 Exchange
时执行一些拆分,这当然可以是一个文件(使用骆驼文件组件)。但是,在拆分时,每个 "chunk" 然后被发送到一个专用的 Processor
。
问题是块本身是一个 Exchange
并且意味着要放在内存中(以便以后能够并行执行任务)。在你的情况下,我假设这部分数据仍然太大而无法在内存中处理。如果没有,Camel 会满足您的需求,甚至执行与您描述的系统集成所需的所有轮询。
你要求不要提出任何建议,但如果我是你,我会尝试 Spring Batch。
我认为 Apache Camel 适合您的需求,因为它是迄今为止我发现的最好的集成框架之一。
我现在的项目涉及ECM处理,需要处理大量文档,可能达到1个million/day。
作为输入,我们有 XML 个代表一组文档(或大量文档)的文件以及指向存储在 NAS 上的真实文件的链接。
首先,我们必须将所有这些 XML 文件转换为专有 XML 格式,这种格式适用于我们的 ECM 系统(我们的黑盒)使用的专有文档导入器,并将它们拆分为更小的部分,以便利用多个导入队列。
然后我们必须监控导入器队列并正确调度它们以平衡队列负载,在该操作之后我们必须找出从输出专有格式 XML 文件中读取的操作结果由进口商生成。
在此过程的每一步之间都有一个 ActiveMQ 队列(具有数据库持久性),以保持所有异步和每个阶段 可以扩大规模,增加该特定队列上的并发消费者数量。
此外,我们的微服务是由 ESB 管理的庞大而冗长的工作流的一部分,因此我们从 ESB 提供的队列获取输入消息并写入输出消息 再次回到这些队列,使用小型 Web 服务 get/set 对象。
我们决定选择 Camel,因为它解决了许多集成问题,它可以完全控制每条路线,并且可以通过 hawtio 轻松监控。
此外,大部分配置都是通过编写或修改 xml 上下文文件来完成的,这为您提供了灵活性并避免了编写大量代码。 社区很活跃,框架更新很频繁,你可以找到很多书籍和教程。
所以我认为你的问题与我的项目目标相比有很多联系点和亲和力,所以我还是决定使用Apache Camel。
效果很好。