【问题标题】:Parallel Item Writers in Spring batchSpring批处理中的并行项目编写器
【发布时间】:2016-09-22 01:46:05
【问题描述】:

我对 Spring 批处理框架相当陌生。

我正在尝试使用commit-interval=10000 在阅读器中读取大约 100 万条记录,而在编写器中我需要对项目列表做两件事。

  1. 将项目列表存储到 DB
  2. 将这些项目中的少量信息写入平面文件。

我认为这两个任务可以并行运行,而不是在 writer 类中编写顺序的 java 代码。

让两个编写器并行操作并完成各自任务的最佳方式应该是什么?

【问题讨论】:

  • 为了清楚起见,您实际上是在要求一个并行工作的CompositeItemWriter,对吗?
  • 是的,没错。
  • 那你就需要自己写了。目前没有一个可以做到这一点。您将基本上模仿我们的CompositeItemWriter 中的代码,但将对每个代码的写入委托给TaskExecutor。然而,说实话,100 万条记录并不多(取决于每条记录的大小),所以这可能比它的价值更多......
  • 好的,谢谢您的意见。它有帮助。

标签: java parallel-processing spring-batch scalability


【解决方案1】:

您有多种选择。

选项 1:

  • 创建一个将所有条目写入文件的选择步骤
  • 在第一步之后创建两个并行步骤。他们都必须从同一个文件中读取。一个写入数据库,另一个写入文件

缺点:

  • 如果两个并行步骤之一失败或跳过项目,则 文件和数据库将不一致
  • 您必须创建一个额外的步骤

选项 2:
不要尝试并行运行对文件和数据库的写入,而是让您的块并行运行:

  • 使用 SynchronizedItemStreamReader 从源中读取(如果使用并行块处理,则必须使用同步读取器)
  • 使用配置了 db-writer 和 filewriter 的复合编写器(注意:您必须将文件编写器包装到 synchronizedWriter -> 框架中没有用于此的类,但原理与 SynchronizedItemStreamReader 中使用的相同)
  • 配置您的任务以并行处理步骤(设置 asynctaskexecutor,设置油门限制)

优点:

  • 如果您的数据库可以处理,您可以轻松地并行写入 10 个块

缺点:

  • 如果您使用并行块处理,则在作业中重新启动是 不可能。这意味着,在重新启动的情况下,该步骤必须是 完全执行,这意味着您需要处理条目 已经写入数据库的文件

选项 3:
忘记并行性:写入文件比写入数据库要快得多,因此开销不应产生重大影响。 只需使用配置了 db- 和 filewriter 的复合编写器。

【讨论】:

  • 感谢您的详细回复,@Hansjoerg。如果我选择选项 3,它将是顺序处理,不是吗?
  • 是的,这将是一个连续的过程。我仍然会使用复合项目编写器。这样,两个目标的条目都写入同一个事务中。请注意,您必须将两个编写器都注册为“流”到该步骤,以便调用 open close 并更新上下文以具有可重新启动性。
猜你喜欢
  • 2013-09-25
  • 2021-11-19
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2020-09-07
相关资源
最近更新 更多