分布式定时任务入门| 青训营笔记

111 阅读4分钟

[toc]

课程地址

juejin.cn/course/byte…

分布式定时任务的技术要点和技术路径

  1. 任务调度器:

    • 选择合适的调度算法,如Cron表达式、固定延迟、固定频率等。
    • 考虑任务的优先级、重试次数和执行窗口等因素。
  2. 分布式锁:

    • 用于保证在多个节点上同时只有一个任务实例在运行,避免任务重复执行。
    • 可以使用基于数据库、Redis、ZooKeeper等实现的分布式锁。
  3. 任务分片:

    • 将大型任务分成多个子任务,分配给不同的节点并行执行,提高执行效率。
    • 根据任务的特点选择合适的分片策略,如基于数据量、时间范围等。
  4. 负载均衡:

    • 根据节点的性能和负载情况,合理分配任务,避免资源浪费和瓶颈。
    • 可以使用基于权重、轮询、最小连接数等策略的负载均衡算法。
  5. 高可用:

    • 考虑故障转移和容错能力,确保任务在某个节点出现故障时,能够自动切换到其他节点继续执行。
    • 可以使用基于心跳检测、主备切换等机制实现高可用。
  6. 任务监控与告警:

    • 对任务执行情况进行实时监控,确保任务按计划执行。
    • 当任务出现异常时,及时发出告警通知,以便运维人员进行处理。
  7. 数据一致性:

    • 在多个节点间保持数据的一致性,避免数据不一致导致的问题。
    • 可以使用基于事务、数据同步、最终一致性等技术实现数据一致性。
  8. 技术选型:

    • 根据项目需求和团队技术栈,选择合适的分布式定时任务框架和中间件,如Quartz、Elastic-Job、xxl-job等。
  9. 容器化与微服务:

    • 可以使用容器化技术(如Docker、Kubernetes)部署和管理分布式定时任务,提高资源利用率和可扩展性。
    • 将定时任务拆分成独立的微服务,实现松耦合和可独立部署。

分布式定时任务中触发器的实现方案

  1. 基于Cron表达式:

    • Cron表达式是一种强大的定时任务调度语言,可以用来表示复杂的时间规则。
    • 使用Cron表达式作为触发器,可以灵活地定义任务的执行周期。例如,Quartz框架就支持基于Cron表达式的触发器。
  2. 基于固定延迟或固定频率:

    • 固定延迟指的是在上一个任务执行完毕后,经过固定的时间间隔再执行下一个任务。
    • 固定频率指的是任务按照固定的时间间隔执行,不考虑任务执行所需的时间。
    • 使用这种方式可以实现简单的任务调度,如Java中的ScheduledExecutorService或Spring框架的@Scheduled注解。
  3. 基于事件驱动:

    • 任务执行可以由其他系统或服务中产生的事件触发。
    • 可以使用消息队列(如Kafka、RabbitMQ等)或事件总线(如Apache Kafka Streams、Google Cloud Pub/Sub等)实现事件驱动的触发器。
  4. 基于分布式调度系统:

    • 使用分布式调度系统(如Apache Mesos、Kubernetes等)进行任务调度和触发。
    • 这些调度系统通常提供了强大的任务管理和调度能力,可以实现高度自动化和可扩展的任务触发。
  5. 基于时间轮算法:

    • 时间轮算法是一种高效的定时任务调度算法,适用于大量定时任务的场景。
    • 基于时间轮算法的触发器可以实现高性能和低延迟的任务触发。例如,Netty框架中的HashedWheelTimer就使用了时间轮算法。
    • 不同业务之间,任务的调度相互影响怎么办?负责扫描和触发的机器挂了怎么办? 解法思路:存储上,不同国别、业务做资源隔离。运行时,不同国别、业务分开执行。部署时,采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只被触发一次。
  6. 基于数据库调度:

    • 使用数据库表存储任务信息和执行计划,通过查询数据库来触发任务。
    • 这种方式适用于任务信息需要持久化存储的场景,但性能可能较低。

业内定时任务框架比较

image.png

分布式定时任务业务实践

业务应用:

  • 电商:订单30分钟未付款自动关闭订单。定时给商家、达人发消息,给用户发放优惠券等
  • 互动:支付宝集五福。字节春节集卡瓜分红包。
  • 游戏:活动结束后批量补发用户未领取的奖励。定期更新游戏内榜单。

有时候分布式定时任务也可以用其他技术:Hive引擎,Flink引擎,消息队列

image.png