使用不同节点中的应用程序 运行 处理数据库中的记录

Processing records in database with application running in different nodes

我需要处理来自数据库的 100K 条记录,处理它们并更新数据库中记录的状态。如果应用程序 运行ning 在多个节点上,如何确保相同的记录不会被多个节点选择进行处理?

此过程由每小时 运行 的石英调度程序触发,我们无法灵活地将每个节点上的调度程序配置为 运行 在不同时间。

实现此目标的最佳方法是什么?

有多种方法,目前我想到以下两种。

(1) 使用数据库行锁 让您的节点在节点即将处理的记录上放置一个独占数据库行锁(select 用于更新)。如果节点可以放置锁,则进程可以自由处理记录。否则,该节点应尝试另一条记录,因为其他某个节点已锁定该记录并且当前正在处理该记录。您应该随机化 select 未处理记录的离子,以在某种程度上最大限度地减少多个节点竞争处理相同记录的机会。

(2) 为您的节点分配一些 ID,并让您的节点使用这些 ID select 从已处理的数据集中分离记录。例如,如果您有 10 个节点,则为它们分配 ID 0 到 9。然后通过应用一些生成数字 0 到 9 的函数,根据记录 ID 将未处理的记录拆分为分离集。例如,您可以使用 MOD 函数。然后,您的节点将 select 仅那些 ID 等于节点 ID 的未处理记录。这在 SQL 中实现起来非常简单,只要您可以为您的节点分配一些唯一且连续的 ID。

如果我是你,我可能会选择第二种解决方案。