技术开发 频道

如何处理任务调度程序的若干问题?

    任务调度对应用程序集群的影响 

    对于有集群要求的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两个节点进行了两次解锁,其中一次是多余的。在这样的场景中,多次运行的任务除了做画蛇添足的事情外,并没有带来什么负面影响。但有些重复执行的任务的影响是有害的,如定期生成统计数据任务、定期转账任务。所以需要将具有全局影响的任务调度程序和业务应用程序分开,只在业务应用程序上实行集群部署,而任务调度程序采用单服务运行的机制,如下图所示:


带任务调度系统的集群部署方案

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

0
相关文章