在我们当前的 Java 项目中,我们需要批处理大量记录。一旦完成此处理,它必须重新开始并再次处理所有记录。此处理必须并行化并分布在多个节点中。
记录本身存储在数据库中。使用一些 ID 范围(例如 1-10000)来标识批处理就足够了。
从高层次的角度来看,我看到了以下步骤:
- 一个子任务处理一批记录。
- 主任务检查是否有任何子任务仍在运行。如果没有,为每批记录创建一个子任务。
我们大量使用 MongoDB,并考虑在其中持久化子任务。然后,每个节点可以拾取尚未完成的子任务,进行处理并将记录标记为完成。一旦没有未完成的子任务,主任务将重新创建所有子任务。这可能会奏效,但我们正在寻找一种解决方案,我们不需要自己进行繁重的同步工作。
- 这可能是 akka 的一个可能用例吗? ?
- 可以akka-persistence用于同步不同节点之间的处理?
- 是否有任何其他 Java/JVM 框架适合这项工作?
最佳答案
您的问题对于 SO 的格式来说太宽泛了。请阅读此guide在未来提问之前,不要让你的小组成员投票赞成你的问题只是为了夸大明显不恰当的问题 (͡° ͜ʖ ͡°)。
无论如何:
1) 是的,您可以在 Akka 中实现您的要求。特别是,由于您提到了多个节点,您正在查看 akka-cluster 模块(用于节点间通信),并且您可能还需要 akka-cluster-sharding(以防您希望在处理过程中将所有数据保存在内存中) ).
2) 不,我强烈不推荐这样做。虽然您可以在技术上强制您的问题使用 akka-persistence 来同步任务,但 akka-persistence 的目标只是让 actor 的状态持久化。 Akka 本身的基本形式足以处理所有同步问题。只需让主参与者为每个子任务创建一个工作人员并监控其完成情况。
3) 是的。请注意,无论什么工作,这个问题的答案总是肯定的。
关于java - 分布式、同步批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43694063/