确保单个服务器执行任务

时间:2016-05-03 08:13:25

标签: database-design

我有多台服务器,需要执行在给定时间安排的作业。

作业在数据库中定义,每个服务器与之通信。 我需要确保只有一台服务器执行作业。

想象一下这种情况:

  1. 将来某个时间安排工作。

  2. 在T,两台服务器都会唤醒并执行以下查询:update messages set claimedBy = <server_id> where claimedBy = null and timeToRun = <the scheduled time> limit 10

  3. 每个服务器执行其作业,最后设置processed 列到true,以便我们知道它实际上已经处理过了(这个 当服务器崩溃等时会有所帮助。)

  4. 这个方案听起来如何?你觉得它有什么问题吗?

    或者也许让一台服务器通过将作业传递给他们来“协调”其他服务器,以便问题不存在?

1 个答案:

答案 0 :(得分:1)

只要您在一次交易中查找和更新记录的逻辑发生,这听起来没问题,即不会发生多个服务器的冲突更新。

具有一个协调服务器的解决方案具有pro和con。 Pro:如果有一天需要,您可以实现一些内部逻辑来决定哪个服务器应该获取哪些作业。 Con:您依赖于那台服务器。当一些服务器关闭时,第一个解决方案也会起作用,只要其中至少有一个服务器启动。