OpenShift 中的 Spring 批处理 JDBCPagingItemReader、ThreadPoolTask​​Executor 和多个 pod

Posted

技术标签:

【中文标题】OpenShift 中的 Spring 批处理 JDBCPagingItemReader、ThreadPoolTask​​Executor 和多个 pod【英文标题】:Spring batch JDBCPagingItemReader, ThreadPoolTaskExecutor and multiple pods in OpenShift 【发布时间】:2019-11-18 19:25:29 【问题描述】:

我们有一个带有块处理功能的 Spring 批处理应用程序,它从数据库中读取记录、处理它们并调用服务/执行一些插入/更新数据库中的一些表作为写入器的一部分。

JDBCPagingItemReader 已被使用,因为当 saveState 为 false 时它是线程安全的。 已设置排序键,因此线程不会相互交叉。 此外,隔离级别ISOLATION_READ_COMMITTED 已用于 Oracle 数据源和 Spring 批处理的 JobRepository 配置。

使用ThreadPoolTaskExecutor 的多个线程目前在单个实例中运行良好。

我们最终应该在 OpenShift 中部署这个 Spring Boot 应用程序,该应用程序将在多个 PODS 中运行,即应用程序的多个实例都从同一个表中读取。

有知识的人可以告诉我在多个 pod(实例)中使用上述组合是否有任何问题,或者是否存在必须处理的并发问题。

高度赞赏此方案中的任何最佳实践。

感谢您的宝贵时间。

【问题讨论】:

如何让每个实例(多线程作业)处理表的不同部分?这将通过设计解决问题。 每个多线程作业已经使用 JDBCPagingItemReader 使用 sortKeys 处理不同的行集。但这一切都发生在 openshift 的 pod 内或虚拟机内。但我担心的是跨多个 pod 或多个 VM。恐怕处理不同数据集的多个实例不适用于我们的场景,但我很想知道它是如何配置的。 我的评论是关于多个 pod,我添加了一个包含更多详细信息的答案。 【参考方案1】:

您可以对表进行分区并将每个分区分配给一个 pod。然后,每个分区由一个多线程作业处理。所以这里有两种并行度:跨 pod(多个 JVM)和每个 pod 内(多个线程)。

有知识的人可以告诉我在多个 pod(实例)中使用上述组合是否有任何问题,或者是否存在必须处理的并发问题。

如果数据集正确分区且分区之间没有重叠,则不会出现并发问题。

【讨论】:

感谢您的回复。我们的分区基于月-年,遗憾的是两个 pod 都必须从同一个分区中检索数据。我确实检查了处理的每条记录在哪里更新表中的字段。目前,当跨 pod 选择重复记录时,无法更新字段的实例不会进一步进行。

以上是关于OpenShift 中的 Spring 批处理 JDBCPagingItemReader、ThreadPoolTask​​Executor 和多个 pod的主要内容,如果未能解决你的问题,请参考以下文章

如何在 openshift 中使用 keycloak 和 spring 读取所有用户?

如何在 OpenShift 上部署多模块 maven spring boot 应用程序

使用 Spring 框架在 Openshift JSON 对象中返回的问题 [重复]

Openshift 中 H2 数据库的 URL

Java Spring MVC WebSocket 应用程序仅适用于本地应用程序服务器,但不适用于 openshift 主机

Spring Dataflow批处理框架在OCP上的部署