【问题标题】:How to implement Spring batch remoting and still maintain order of writing?如何实现 Spring 批量远程处理并仍然保持写作顺序?
【发布时间】:2013-08-13 11:22:09
【问题描述】:

我是 Spring Batch 的新手,刚刚开始进行 POC,以证明 Spring Batch 能够在一小时内处理 100 万条记录。然而,该架构要求我们也展示水平可扩展性。

我已经阅读了分区和远程分块策略。两者都对我有意义。两者之间的本质区别在于远程分块需要一个持久的消息队列,因为实际写入数据库或文件是从主服务器发生的。在分区中不需要持久消息队列,因为写入发生在从站。

然而,我完全迷失的是,如何确保这两种并行处理变体的结果以正确的顺序写出? .

我们以分区为例。据我了解,如果将处理 1000 条记录的特定步骤分成 10 个并行步骤执行,每个执行都有自己的 Reader、Processor 和 Writer,那么其中一个执行很容易在另一个之前完成。结果是其中一个步骤执行的 ItemWriter 可以在处理记录 300-300 的结果写入同一个表之前将处理记录 300-400 的结果写入表,因为该特定步骤执行可能滞后。

这意味着现在我有一个输出表,其中包含所有处理结果,但它们的排序顺序不正确。可能需要进一步的顺序处理,只需将它们恢复到从 1 到 1000 的正确排序顺序即可。

我很难理解,如何确保正确排序的输出,同时通过 Spring Batch 中描述的远程处理策略水平扩展系统。

这两本书我都读过。 http://www.manning.com/templier/http://www.apress.com/9781430234524 但这些书中也没有任何内容可以回答我的问题。

【问题讨论】:

    标签: java spring batch-processing spring-batch


    【解决方案1】:

    我认为您不能这样做,因为 Table 自然是未排序的。如果您需要以某种方式对它们进行排序,请添加由 writer 管理的 order 列。第一个分区写入 1-100,第二个分区写入 101-200,依此类推。下一步阅读器将按 [order column] 获取项目订单。由于先前分区程序中缺少写入而导致的订单列之间的空洞不是问题。我的 2 美分

    【讨论】:

    • 我正在转向类似的东西。我正在考虑实现 StepExecutionListener 并覆盖 afterStep 方法。因此,一旦项目编写器完成了它的工作并且 afterStep 被调用,我将从 afterStep 调用一个数据库过程来对记录进行排序。
    • 如果您能够在 afterStep 中进行排序,为什么不在下一步读取有序并避免在侦听器中更新?如果 sp 出错并且您在下一步中有未排序的项目? IMO 数据更新应(尽可能)在事务生命周期(即块生命周期)中完成
    猜你喜欢
    • 2017-08-08
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多