我想要多个服务器处理来自单个数据库表的数据



我在一个关系数据库上有一个数据库表。数据将被装入其中。然后,我希望有多个服务器并发地处理该数据(我不希望一次只有一个服务器运行)。例如,每个服务器将:

  • 固定行数的查询
  • 为检索到的每一行做一些工作
  • 更新每一行显示它已被处理

如何确保每一行只处理一次?注意,我不想预先分配一行数据给服务器;我正在设计高可用性,所以如果一个或多个服务器宕机,解决方案应该保持运行。

到目前为止,我的解决方案如下:

  1. 表有三列:LOCKED_BY (VARCHAR), LOCKED_AT (TIMESTAMP)和PROCESSED (CHAR)
  2. 每个服务器启动时都试图"伪锁定"。
UPDATE THE_TABLE
SET LOCKED_BY= $servername, 
LOCKED_AT = CURRENT_TIMESTAMP,
WHERE (LOCKED_BY = null OR (CURRENT_TIMESTAMP- LOCKED_AT > $timeout)
AND PROCSSED = 'N'

。尝试"伪锁定"尚未锁定的行或伪锁已过期的行。只对未处理的行执行此操作。

  1. 可能有多个服务器同时尝试此操作。当前服务器需要查询是否在"伪锁"中成功:
SELECT * FROM THE_TABLE
WHERE LOCKED_BY = $server_name
AND PROCESSED = 'N'

如果返回任何行,服务器可以处理它们。

  1. 一旦处理完成,行被更新
UPDATE THE_TABLE SET PROCESSED = 'Y' WHERE PRIMARYKEYCOL = $pk

注意:update语句应该限制更新的行数。

如果您愿意更换平台,那么我建议您使用像Snowflake这样的基于云的现代解决方案。这将做你想做的事情,但在后台和默认情况下-所以你不需要知道它在做什么或如何做(除非你想)。

这可能会给人一种傲慢的感觉,这不是我的本意,但你所尝试的(以你尝试的方式)是非常复杂的;所以,如果你不知道怎么做,那么别人告诉你怎么做是不会给你成功实施它所需的技能/经验的