Mule 批处理 vs foreach vs 拆分器聚合器
Mule batch processing vs foreach vs splitter-aggregator
在 Mule 中,我有很多记录要处理,其中处理包括一些计算,来回数据库等。我们可以使用这些选项处理记录集合
批处理
ForEach
拆分聚合器
那么它们之间的主要区别是什么?我们什么时候应该更喜欢一个而不是其他人?
例如,Mule 批处理选项似乎没有批处理作业范围变量定义。或者,如果我想利用多线程来加快整体任务怎么办?或者,如果我想在处理过程中修改负载,哪个更好?
对于 Splitter 和 Aggregator ,您负责编写拆分逻辑,然后在处理结束时将它们重新加入。当您想使用不同的服务器异步处理记录时,它很有用。与其他选项相比,它不太可靠,这里可以并行处理。
Foreach 更可靠,但它使用单线程(同步)迭代处理记录,因此无法进行并行处理。默认情况下,每条记录创建一条消息。
批处理旨在以非常快速和可靠的方式处理数百万条记录。默认情况下 16 个线程将处理您的记录并且它也很可靠。
请阅读下面的 link 了解更多详情。
https://docs.mulesoft.com/mule-user-guide/v/3.8/splitter-flow-control-reference
当你写 "quite many" 时,我假设它对主内存来说太多了,这排除了 spliter/aggregator 因为它必须将所有记录收集到 return 它们作为列表。
我假设您的记录在流或迭代器中,否则您可能有内存问题...
那么什么时候用for-each什么时候用batch呢?
每个
最简单的解决方案,但它有一些缺点:
- 它是单线程的(因此对于您的用例来说可能太慢了)
- 是"fire and forget":你不能在循环中收集任何东西,例如一条记录数
- 不支持处理"broken"条记录
在循环中,您可以有几个步骤(消息处理器)来处理您的记录(例如,对于提到的数据库查找)。
可能是缺点,可能是优点:循环是同步的。 (如果要处理异步,请将其包装在异步范围内。)
批量
要做/要理解的东西多一点,但功能更多:
- 从流程调用时,总是异步的(这可能是一个缺点)。
- 可以是独立的(例如,内部有一个投票开始)
- 当加载阶段产生的数据过大时,会自动卸载到磁盘。
- 免费多线程(线程数可配置)
- "broken records" 的处理:批处理步骤只能对 good/broken 条记录执行。
- 最后会得到统计数据(记录数、成功记录数等)
看来你最好使用批处理。
我一直在使用方法将数组中的记录传递给存储过程。
您可以在 for 循环中调用存储过程并相应地设置 for 循环的批处理大小以避免往返。我已经使用了这种方法并且性能很好。您可能必须创建另一个 table 来记录结果并在存储过程中也具有该逻辑。
下面是包含所有详细信息的 link
https://dzone.com/articles/passing-java-arrays-in-oracle-stored-procedure-fro
在 Mule 中,我有很多记录要处理,其中处理包括一些计算,来回数据库等。我们可以使用这些选项处理记录集合
批处理
ForEach
拆分聚合器
那么它们之间的主要区别是什么?我们什么时候应该更喜欢一个而不是其他人?
例如,Mule 批处理选项似乎没有批处理作业范围变量定义。或者,如果我想利用多线程来加快整体任务怎么办?或者,如果我想在处理过程中修改负载,哪个更好?
对于 Splitter 和 Aggregator ,您负责编写拆分逻辑,然后在处理结束时将它们重新加入。当您想使用不同的服务器异步处理记录时,它很有用。与其他选项相比,它不太可靠,这里可以并行处理。
Foreach 更可靠,但它使用单线程(同步)迭代处理记录,因此无法进行并行处理。默认情况下,每条记录创建一条消息。
批处理旨在以非常快速和可靠的方式处理数百万条记录。默认情况下 16 个线程将处理您的记录并且它也很可靠。
请阅读下面的 link 了解更多详情。
https://docs.mulesoft.com/mule-user-guide/v/3.8/splitter-flow-control-reference
当你写 "quite many" 时,我假设它对主内存来说太多了,这排除了 spliter/aggregator 因为它必须将所有记录收集到 return 它们作为列表。
我假设您的记录在流或迭代器中,否则您可能有内存问题...
那么什么时候用for-each什么时候用batch呢?
每个
最简单的解决方案,但它有一些缺点:
- 它是单线程的(因此对于您的用例来说可能太慢了)
- 是"fire and forget":你不能在循环中收集任何东西,例如一条记录数
- 不支持处理"broken"条记录
在循环中,您可以有几个步骤(消息处理器)来处理您的记录(例如,对于提到的数据库查找)。
可能是缺点,可能是优点:循环是同步的。 (如果要处理异步,请将其包装在异步范围内。)
批量
要做/要理解的东西多一点,但功能更多:
- 从流程调用时,总是异步的(这可能是一个缺点)。
- 可以是独立的(例如,内部有一个投票开始)
- 当加载阶段产生的数据过大时,会自动卸载到磁盘。
- 免费多线程(线程数可配置)
- "broken records" 的处理:批处理步骤只能对 good/broken 条记录执行。
- 最后会得到统计数据(记录数、成功记录数等)
看来你最好使用批处理。
我一直在使用方法将数组中的记录传递给存储过程。 您可以在 for 循环中调用存储过程并相应地设置 for 循环的批处理大小以避免往返。我已经使用了这种方法并且性能很好。您可能必须创建另一个 table 来记录结果并在存储过程中也具有该逻辑。
下面是包含所有详细信息的 link https://dzone.com/articles/passing-java-arrays-in-oracle-stored-procedure-fro