几种主流的分布式定时任务,你知道哪些?( 二 )

Spring会监听符合以下格式的Redis消息
private static final Topic TOPIC_ALL_KEYEVENTS = new PatternTopic("__keyevent@*");基于Redis的定时任务能够适用的场景也比较有限 , 但实现上相对简单 , 但对于功能幂等有很大要求 。从使用场景上来说 , 更应该叫做延时任务 。
场景举例:

  • 订单下单之后15分钟后 , 用户如果没有付钱 , 系统需要自动取消订单 。
  • 红包24小时未被查收 , 需要延迟执退还业务;
优劣势是:
  • 被动触发 , 对于服务的资源消耗更小;
  • Redis的Pub/Sub不可靠 , 没有ACK机制等 , 但是一般情况可以容忍;
  • 键空间通知功能会耗费一些CPU
分布式定时任务引入分布式定时任务组件or中间件将定时任务作为单独的服务 , 遏制了重复消费 , 独立的服务也有利于扩展和维护 。
quartz依赖于MySQL , 使用相对简单 , 可多节点部署 , 通过竞争数据库锁来保证只有一个节点执行任务 。没有图形化管理页面 , 使用相对麻烦 。
elastic-job-lite依赖于Zookeeper , 通过zookeeper的注册与发现 , 可以动态的添加服务器 。
  • 多种作业模式
  • 失效转移
  • 运行状态收集
  • 多线程处理数据
  • 幂等性
  • 容错处理
  • 支持spring命名空间
  • 有图形化管理页面
LTS依赖于Zookeeper , 集群部署,可以动态的添加服务器 。可以手动增加定时任务 , 启动和暂停任务 。
  • 业务日志记录器
  • SPI扩展支持
  • 故障转移
  • 节点监控
  • 多样化任务执行结果支持
  • FailStore容错
  • 动态扩容
  • 对spring相对友好
  • 有监控和管理图形化界面
xxl-job国产 , 依赖于MySQL,基于竞争数据库锁保证只有一个节点执行任务 , 支持水平扩容 。可以手动增加定时任务 , 启动和暂停任务 。
  • 弹性扩容
  • 分片广播
  • 故障转移
  • Rolling实时日志
  • GLUE(支持在线编辑代码 , 免发布)
  • 任务进度监控
  • 任务依赖
  • 数据加密
  • 邮件报警
  • 运行报表
  • 优雅停机
  • 国际化(中文友好)
总结微服务下 , 推荐使用xxl-job这一类组件服务将定时任务合理有效的管理起来 。而单点的定时任务有其局限性 , 适用于规模较小、对未来扩展要求不高的服务 。
相对而言 , 基于spring task的定时任务最简单快捷 , 而xxl-job的难度主要体现在集成和调试上 。无论是什么样的定时任务 , 你都需要确保:
  • 任务不会因为集群部署而被多次执行 。
  • 任务发生异常得到有效的处理
  • 任务的处理过慢导致大量积压
  • 任务应该在预期的时间点执行
中间件可以将服务解耦 , 但增加了复杂度
来源:
juejin.cn/post/6930912870058328071




推荐阅读