分布式任务调度

一、需求场景

1、支付系统

    1.1 每天凌晨1点跑批,进行一天清算,每月1号进行上个月清算;

    1.2 购票系统,超过30分钟没有成功支付订单的,进行回收处理;

2、活动

    2.1 电商整点抢购,商品价格8点整开始优惠;    

3、通知

    3.1 商品成功发货后,需要向客户发送短信提醒;


二、解决方案

1、消息与定时任务差异

    1.1 可互换场景

        通知类:电商发货成功发短信通知客户的业务场景,我们可以在发货成功后发送MQ消息到队列,然后去消费mq消息,发送短信。

    1.2 非互换场景

    a)时间驱动/事件驱动:内部系统一般可以通过时间来驱动,但涉及到外部系统,则只能使用时间驱动。如怕取外部网站价格,每小时爬一次。

    b)批量处理/逐条处理:批量处理堆积的数据更加高效,在不需要实时性的情况下比消息中间件更有优势。而且有的业务逻辑只能批量处理。如移动每个月结算我们的话费。

    c)实时性/非实时性:消息中间件能够做到实时处理数据,但是有些情况下并不需要实时,比如:vip升级。

    d)系统内部/系统解耦:定时任务调度一般是在系统内部,而消息中间件可用于两个系统间。


2、单机实现方案

    2.1 方案对比

    Timer:是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,缺点异常未检查会中止线程

    ScheduledExecutorService:相对延迟或者周期作为定时任务调度,缺点没有绝对的日期或者时间

    Spring定时框架:配置简单功能较多,如果系统使用单机的话可以优先考虑Spring定时器


3、分布式实现方案

    3.1  关键点

    批量任务,多主机,多线程,动态扩展,实时或定时任务,分片,并发,不重复执行。    

    3.2 方案对比  

方案对比图
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容