2016-05-03 32 views
0

我有多个服务器,需要在给定时间执行计划的作业。确保单个服务器执行任务

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

所以,想象一下这样的场景:

  1. 作业计划在未来一段时间T。

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

  3. 每个服务器执行其工作,并在年底,设置processedtrue,让大家知道它是实际处理(这个 将有助于服务器崩溃等)。

该方案如何发声?你看到有什么问题吗?


或者,也许这是一个更好的主意,有通过将工作给他们“坐标”的人,所以这个问题也就不存在了一台服务器?

回答

1

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

带有一个协调服务器的解决方案有一个专业版和一个con。 Pro:你可以实现一些intracate逻辑来决定哪个服务器应该得到哪些工作,如果有一天需要的话。 Con:你依赖那台服务器。当有些服务器停机时,只要其中至少有一个服务器启动,第一种解决方案也可以工作。