OpenShift 中的 Spring 批处理 JDBCPagingItemReader、ThreadPoolTaskExecutor 和多个 pod
Posted
技术标签:
【中文标题】OpenShift 中的 Spring 批处理 JDBCPagingItemReader、ThreadPoolTaskExecutor 和多个 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、ThreadPoolTaskExecutor 和多个 pod的主要内容,如果未能解决你的问题,请参考以下文章
如何在 openshift 中使用 keycloak 和 spring 读取所有用户?
如何在 OpenShift 上部署多模块 maven spring boot 应用程序
使用 Spring 框架在 Openshift JSON 对象中返回的问题 [重复]
Java Spring MVC WebSocket 应用程序仅适用于本地应用程序服务器,但不适用于 openshift 主机