我有多台服务器,需要执行在给定时间安排的作业。
作业在数据库中定义,每个服务器与之通信。 我需要确保只有一台服务器执行作业。
想象一下这种情况:
将来某个时间安排工作。
在T,两台服务器都会唤醒并执行以下查询:update
messages set claimedBy = <server_id> where claimedBy = null
and timeToRun = <the scheduled time> limit 10
每个服务器执行其作业,最后设置processed
列到true
,以便我们知道它实际上已经处理过了(这个
当服务器崩溃等时会有所帮助。)
这个方案听起来如何?你觉得它有什么问题吗?
或者也许让一台服务器通过将作业传递给他们来“协调”其他服务器,以便问题不存在?
答案 0 :(得分:1)
只要您在一次交易中查找和更新记录的逻辑发生,这听起来没问题,即不会发生多个服务器的冲突更新。
具有一个协调服务器的解决方案具有pro和con。 Pro:如果有一天需要,您可以实现一些内部逻辑来决定哪个服务器应该获取哪些作业。 Con:您依赖于那台服务器。当一些服务器关闭时,第一个解决方案也会起作用,只要其中至少有一个服务器启动。