我们需要通过多个节点处理需要大量时间的任务(解析巨大的 xml 文件并将数据插入数据库)。节点不会很多,我们甚至会从单个节点开始。
这些文件将从 FTP 读取。该作业将被安排并每天进行一次。什么是分配处理的好方法?
我目前的草稿想法是:
- 使用 hazelcast 分布式
ConcurrentMap
- 它处理场景背后的地图同步 - 每个节点获取整个文件列表并将其打乱
- 然后每个节点迭代列表,使用
.putIfAbsent(..)
- 如果文件不在地图中,则处理它。如果它在地图中,则表示另一个节点正在处理它,因此请尝试下一个文件。
那样:
- 节点永远不会空闲
- 如果一个节点发生故障,其他节点仍将处理所有内容(只是速度较慢)
- 由于文件很大并且处理它们需要大量时间,因此
.putIfAbsent(..)
调用和底层同步中的争用开销很小(改组也旨在改善这一点) - 它需要最少的配置,不需要安装和管理其他服务(如消息队列)
我不确定这是否是最好的方法。可以吗?有什么可以改进的?有更好的吗?