[toc]
课程地址
分布式定时任务的技术要点和技术路径
-
任务调度器:
- 选择合适的调度算法,如Cron表达式、固定延迟、固定频率等。
- 考虑任务的优先级、重试次数和执行窗口等因素。
-
分布式锁:
- 用于保证在多个节点上同时只有一个任务实例在运行,避免任务重复执行。
- 可以使用基于数据库、Redis、ZooKeeper等实现的分布式锁。
-
任务分片:
- 将大型任务分成多个子任务,分配给不同的节点并行执行,提高执行效率。
- 根据任务的特点选择合适的分片策略,如基于数据量、时间范围等。
-
负载均衡:
- 根据节点的性能和负载情况,合理分配任务,避免资源浪费和瓶颈。
- 可以使用基于权重、轮询、最小连接数等策略的负载均衡算法。
-
高可用:
- 考虑故障转移和容错能力,确保任务在某个节点出现故障时,能够自动切换到其他节点继续执行。
- 可以使用基于心跳检测、主备切换等机制实现高可用。
-
任务监控与告警:
- 对任务执行情况进行实时监控,确保任务按计划执行。
- 当任务出现异常时,及时发出告警通知,以便运维人员进行处理。
-
数据一致性:
- 在多个节点间保持数据的一致性,避免数据不一致导致的问题。
- 可以使用基于事务、数据同步、最终一致性等技术实现数据一致性。
-
技术选型:
- 根据项目需求和团队技术栈,选择合适的分布式定时任务框架和中间件,如Quartz、Elastic-Job、xxl-job等。
-
容器化与微服务:
- 可以使用容器化技术(如Docker、Kubernetes)部署和管理分布式定时任务,提高资源利用率和可扩展性。
- 将定时任务拆分成独立的微服务,实现松耦合和可独立部署。
分布式定时任务中触发器的实现方案
-
基于Cron表达式:
- Cron表达式是一种强大的定时任务调度语言,可以用来表示复杂的时间规则。
- 使用Cron表达式作为触发器,可以灵活地定义任务的执行周期。例如,Quartz框架就支持基于Cron表达式的触发器。
-
基于固定延迟或固定频率:
- 固定延迟指的是在上一个任务执行完毕后,经过固定的时间间隔再执行下一个任务。
- 固定频率指的是任务按照固定的时间间隔执行,不考虑任务执行所需的时间。
- 使用这种方式可以实现简单的任务调度,如Java中的ScheduledExecutorService或Spring框架的@Scheduled注解。
-
基于事件驱动:
- 任务执行可以由其他系统或服务中产生的事件触发。
- 可以使用消息队列(如Kafka、RabbitMQ等)或事件总线(如Apache Kafka Streams、Google Cloud Pub/Sub等)实现事件驱动的触发器。
-
基于分布式调度系统:
- 使用分布式调度系统(如Apache Mesos、Kubernetes等)进行任务调度和触发。
- 这些调度系统通常提供了强大的任务管理和调度能力,可以实现高度自动化和可扩展的任务触发。
-
基于时间轮算法:
- 时间轮算法是一种高效的定时任务调度算法,适用于大量定时任务的场景。
- 基于时间轮算法的触发器可以实现高性能和低延迟的任务触发。例如,Netty框架中的HashedWheelTimer就使用了时间轮算法。
- 不同业务之间,任务的调度相互影响怎么办?负责扫描和触发的机器挂了怎么办? 解法思路:存储上,不同国别、业务做资源隔离。运行时,不同国别、业务分开执行。部署时,采用多机房集群化部署,避免单点故障,通过数据库锁或分布式锁保证任务只被触发一次。
-
基于数据库调度:
- 使用数据库表存储任务信息和执行计划,通过查询数据库来触发任务。
- 这种方式适用于任务信息需要持久化存储的场景,但性能可能较低。
业内定时任务框架比较
分布式定时任务业务实践
业务应用:
- 电商:订单30分钟未付款自动关闭订单。定时给商家、达人发消息,给用户发放优惠券等
- 互动:支付宝集五福。字节春节集卡瓜分红包。
- 游戏:活动结束后批量补发用户未领取的奖励。定期更新游戏内榜单。
有时候分布式定时任务也可以用其他技术:Hive引擎,Flink引擎,消息队列