任务调度对应用程序集群的影响
对于有集群要求的Web应用程序来说,如果应用本身有任务调度的功能,就必须在系统设计初期仔细分析任务调度功能是否适合于集群。需要调度的任务按其功能影响的范围,可以分为两种类型:
(1)局部影响的任务:局部影响的任务只会对集群节点的服务发生影响。比如静态网页定期生成任务、本地缓存刷新任务(假设未使用分布式缓存),这些任务执行的结果仅会对本节点产生影响,它不会产生全局性的影响,因此应用程序集群部署后,并不会对业务逻辑产生破坏。
(2)全局影响的任务:大部分任务的执行结果对于全局是有影响的,比如前面我们所提到的无效帐号清除任务,生成统计数据。这些任务的运行结果对整个系统的影响是全局性的。这种类型的任务不应该和应用程序绑定在一定,应该独立开发和部署,否则会产生重复执行的任务。
为了说明集群环境下全局影响的任务如何发生重复性操作问题,我们来看一个具体的例子,集群中拥有两个节点,它们分别以30分钟为周期运行用户解锁的扫描任务,并动态安排30分钟后需要进行用户解锁的任务:
| 时间 | 集群节点A | 集群节点B |
| 10:10 | 扫描任务工作 | |
| 10:11 | 安排30分钟后所有帐户解锁任务,安排一个任务,在10:30运行,对X帐号进行解锁。 | |
| 10:15 | 扫描任务工作 | |
| 10:16 | 安排30分钟后所有帐户解锁任务,安排一个任务,在10:30运行,对X帐号进行解锁。 | |
| 10:30 | 任务运行,对X帐号进行解锁 | 任务运行,对X帐号进行解锁 |
可见X帐号被A和B两个节点进行了两次解锁,其中一次是多余的。在这样的场景中,多次运行的任务除了做画蛇添足的事情外,并没有带来什么负面影响。但有些重复执行的任务的影响是有害的,如定期生成统计数据任务、定期转账任务。所以需要将具有全局影响的任务调度程序和业务应用程序分开,只在业务应用程序上实行集群部署,而任务调度程序采用单服务运行的机制,如下图所示:

带任务调度系统的集群部署方案
这样,业务应用程序产生业务数据,任务调度程序对数据库中的业务数据进行处理,保证全局影响的任务只会执行一次。当然,局部影响的任务还应该和业务应用程序一起部署。