我需要处理来自DB的100K记录,处理它们并更新DB中记录的状态。如果应用程序在多个节点上运行,如何确保多个节点不会选择相同的记录进行处理?
此过程由每小时运行一次的石英调度程序触发,我们无法灵活地将每个节点上的调度程序配置为在不同时间运行。
实现这一目标的最佳方法是什么?
答案 0 :(得分:0)
目前有各种各样的方法,我想到了以下两种方法。
(1)使用DB行锁 使节点在节点即将处理的记录上放置一个独占的数据库行锁(选择更新)。如果节点可以放置锁,则进程可以自由处理记录。否则,节点应该尝试另一条记录,因为某些其他节点已锁定记录并且当前正在处理该记录。您应该随机选择未处理的记录,以尽量减少多个节点竞争处理相同记录的机会。
(2)为您的节点分配一些ID,并使您的节点使用这些ID从处理的数据集中选择不连续记录。例如,如果您有10个节点,则为它们分配0到9的ID。然后,通过应用一些产生数字0到9的函数,将未处理的记录拆分为基于记录ID的析取集。例如,您可以使用MOD函数。然后,您的节点将仅选择ID等于节点ID的未处理记录。只要您可以为节点分配一些唯一且连续的ID,这在SQL中实现起来非常简单。
如果我是你,我可能会选择第二种解决方案。