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