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

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

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

     业界比较常见的解决思路:
1. 利用linux crontab或windows计划任务定时执行一段脚本或程序;
2. 自编程序中实现定时器,定时触发相关任务的执行;

     但是上述方案在碰到有大量的、不同粒度的定时任务时会碰到问题:
1. 如何解决高可用?
2. 如何支持水平扩展?
     显然如果我们仅在一个服务器节点上起定时器势必形成单点。那么如果简单地在多台服务器节点上起服务呢?那么同样的任务会被执行多次,虽解决了单点问题,但一次任务被执行多次势必造成性能的浪费,且当业务压力增大时无法进行水平扩展;同时,有些业务在同一时刻不能同时执行,这涉及锁的问题。

     下面给出一个比较通用的分布式系统中的定时任务的执行框架实现:

alt

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服务可根据业务的不同实现为不同的服务,根据性能压力分布在数量不等的服务器节点中,以自动负载均衡的方式实现了高可用和水平扩展。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值