一种分布式系统中定时任务的解决思路和框架

时间:2022-08-31 07:49:41
一种分布式系统中定时任务的解决思路和框架

      在分布式系统中,经常有周期性地执行数据采集、统计、推送等等的场景。一个业务系统的后台可能存在很多不同种类、不同粒度的周期性任务,而且它们分布在不同的服务器节点中执行。

     业界比较常见的解决思路:1. 利用linux crontab或windows计划任务定时执行一段脚本或程序;2. 自编程序中实现定时器,定时触发相关任务的执行;
     但是上述方案在碰到有大量的、不同粒度的定时任务时会碰到问题:1. 如何解决高可用?2. 如何支持水平扩展?     显然如果我们仅在一个服务器节点上起定时器势必形成单点。那么如果简单地在多台服务器节点上起服务呢?那么同样的任务会被执行多次,虽解决了单点问题,但一次任务被执行多次势必造成性能的浪费,且当业务压力增大时无法进行水平扩展;同时,有些业务在同一时刻不能同时执行,这涉及锁的问题。
     下面给出一个比较通用的分布式系统中的定时任务的执行框架实现:
一种分布式系统中定时任务的解决思路和框架
1. 将定时任务触发器进行抽象成可独立部署的分布式定时服务Jobschedular    不是抽象成程序模块,而是可独立部署的分布式定时服务。该服务通过配置可支持不同种类、针对不同对象粒度、不同执行周期的定时性计划任务。    Jobschedular根据计划任务的定义,周期性地触发针对某个对象的作业(job)。Jobschedular自身采用主备方式实现高可用,由于它本身只负责产生job,不负责执行job,因此不会用性能压力,没有水平扩展的需求。
2. 通过redis分布式队列分发定时作业    Jobschedular定时生成的作业统一发送到作为分布式队列角色的redis服务器中。Jobschedular和redis之间可通过LVS实现负责均衡和高可用,也可以让Jobschedular随机写入到redis集群中的任意redis节点中。
3. 一组jobexecuter负责执行job   一组或多组实现具体业务的jobexecuter服务,负责从redis集群中实时地从redis集群中pop出job并执行之。这些jobexecuter服务可根据业务的不同实现为不同的服务,根据性能压力分布在数量不等的服务器节点中,以自动负载均衡的方式实现了高可用和水平扩展。