骡子批处理 vs foreach 与拆分器聚合器



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

  1. 批处理

  2. 福尔每

  3. 分路器聚合器

    那么它们之间的主要区别是什么?我们什么时候应该偏爱一个?

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

当你写"相当多"时,我认为它对于主内存来说太多了,这排除了拆分器/聚合器,因为它必须收集所有记录才能将它们作为列表返回。

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

那么何时使用每个,何时使用批处理?

对于每个

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

  1. 它是单线程的(因此对于您的用例来说可能太慢了)
  2. 它是"即发即弃":您无法在循环中收集任何内容,例如记录计数
  3. 不支持处理"损坏"记录

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

可能是一个缺点,也可能是一个优点:循环是同步的。(如果要处理异步,请将其包装在异步作用域中。

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

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

所以看起来你最好使用批处理。

对于拆分器和聚合器,您负责编写拆分逻辑,然后在处理结束时将它们重新连接起来。当您想要使用不同的服务器异步处理记录时,它很有用。与其他选项相比,它的可靠性较低,此处可以并行处理。

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

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

请浏览以下链接了解更多详情。

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

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

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

最新更新