Mule 批处理 vs foreach vs 拆分器聚合器

Mule batch processing vs foreach vs splitter-aggregator

在 Mule 中,我有很多记录要处理,其中处理包括一些计算,来回数据库等。我们可以使用这些选项处理记录集合

  1. 批处理

  2. ForEach

  3. 拆分聚合器

    那么它们之间的主要区别是什么?我们什么时候应该更喜欢一个而不是其他人?

例如,Mule 批处理选项似乎没有批处理作业范围变量定义。或者,如果我想利用多线程来加快整体任务怎么办?或者,如果我想在处理过程中修改负载,哪个更好?

对于 Splitter 和 Aggregator ,您负责编写拆分逻辑,然后在处理结束时将它们重新加入。当您想使用不同的服务器异步处理记录时,它很有用。与其他选项相比,它不太可靠,这里可以并行处理。

Foreach 更可靠,但它使用单线程(同步)迭代处理记录,因此无法进行并行处理。默认情况下,每条记录创建一条消息。

批处理旨在以非常快速和可靠的方式处理数百万条记录。默认情况下 16 个线程将处理您的记录并且它也很可靠。

请阅读下面的 link 了解更多详情。

https://docs.mulesoft.com/mule-user-guide/v/3.8/splitter-flow-control-reference

https://docs.mulesoft.com/mule-user-guide/v/3.8/foreach

当你写 "quite many" 时,我假设它对主内存来说太多了,这排除了 spliter/aggregator 因为它必须将所有记录收集到 return 它们作为列表。

我假设您的记录在流或迭代器中,否则您可能有内存问题...

那么什么时候用for-each什么时候用batch呢?

每个

最简单的解决方案,但它有一些缺点:

  1. 它是单线程的(因此对于您的用例来说可能太慢了)
  2. 是"fire and forget":你不能在循环中收集任何东西,例如一条记录数
  3. 不支持处理"broken"条记录

在循环中,您可以有几个步骤(消息处理器)来处理您的记录(例如,对于提到的数据库查找)。

可能是缺点,可能是优点:循环是同步的。 (如果要处理异步,请将其包装在异步范围内。)

批量

要做/要理解的东西多一点,但功能更多:

  1. 从流程调用时,总是异步的(这可能是一个缺点)。
  2. 可以是独立的(例如,内部有一个投票开始)
  3. 当加载阶段产生的数据过大时,会自动卸载到磁盘。
  4. 免费多线程(线程数可配置)
  5. "broken records" 的处理:批处理步骤只能对 good/broken 条记录执行。
  6. 最后会得到统计数据(记录数、成功记录数等)

看来你最好使用批处理。

我一直在使用方法将数组中的记录传递给存储过程。 您可以在 for 循环中调用存储过程并相应地设置 for 循环的批处理大小以避免往返。我已经使用了这种方法并且性能很好。您可能必须创建另一个 table 来记录结果并在存储过程中也具有该逻辑。

下面是包含所有详细信息的 link https://dzone.com/articles/passing-java-arrays-in-oracle-stored-procedure-fro