分布式任务调度

物联网平台定时任务的分布式执行

概述

物联网平台需要执行大量定时任务:日报表生成、设备离线检测、数据归档、账单结算、套餐到期提醒、设备健康巡检等。这些任务具有周期性、可预测、需可靠执行的特点。分布式任务调度系统如XXL-JOB、Elastic-Job、Quartz Cluster提供任务分片、故障转移、可视化管理,支持多节点并行执行,避免单点故障与重复执行。与流式处理的"持续运行"不同,定时任务是"按计划触发",适合批处理、报表、巡检等场景。

物联网场景下,任务量可能很大:百万设备需按分组分批巡检,多租户需分别生成报表。任务分片可将大任务拆分为多个子任务,由不同节点并行执行,显著缩短总耗时。故障转移确保某节点宕机时,其任务由其他节点接管,不丢不重。

核心功能

任务分片与并行

按设备分组、租户、区域等维度分片,每片由不同节点执行。如"设备离线巡检"按租户分片,租户A由节点1执行,租户B由节点2执行。支持动态分片、自定义分片策略。大幅提升大批量任务的执行效率。

故障转移与Cron

节点宕机时,其未完成或待执行任务自动迁移至其他节点。支持任务依赖、阻塞策略。Cron表达式灵活配置执行周期(如每天0点、每小时、每周一)。支持一次性任务、延迟任务。

执行日志与告警

任务执行历史、日志、耗时、状态。失败告警、重试策略、人工介入。可视化管理界面,任务启停、参数配置、执行监控。

物联网典型应用

日报表、周报表、月报表生成。设备离线巡检(定时扫描在线表,超时未心跳标记离线)。数据归档(将冷数据迁移至对象存储)。套餐到期提醒、账单结算。与物联网业务深度集成,是平台运维与运营的支撑组件。

定时触发与执行权的归属

调度器管理的是任务实例的触发权

调度系统在多个节点之间决定:哪一个时钟到达触发点、哪一个节点拿到执行权、失败后执行权转到哪里。报表怎么汇总、离线怎么判定,仍写在任务代码里。调度器认识的是任务标识、触发表达式、分片参数、阻塞策略和执行记录。一次触发生成一个或多个实例,实例结束要有成功、失败或超时,不能靠进程还在不在来猜测。

一直运行的流作业没有“这次结束”。调度器面向的是有起点和终点的批处理:日报、归档、到期扫描、对账。把秒级告警放进调度器去轮询数据库,触发间隔会变成告警延迟,数据库也会被反复扫满。秒级反应留在事件路径上,调度器负责那些可以等到下一个周期再做完的工作。

可以切成分片并行的批处理

数据能按租户、区域或设备标识区间切开,且各片在同一次执行里不需要看见彼此的中间结果,这样的任务才适合分片。巡检可以按租户分片,每片只扫描自己的在线记录。归档可以按日期和前缀分片。汇总必须先看到全部设备才能出一张表时,分片只能用来产出部分和,最后由一个汇总实例合并。不能让每一片都去写那张最终报表。

分片能在节点故障后转移,还要求任务可以重入:同一分片执行两次,结果与执行一次相同,或者第二次发现第一次已经完成并直接退出。没有这个性质,转移会造成重复扣减、重复通知或重复归档。参数里应带上业务日期和分片边界,禁止依赖“今天”这种随执行时刻变化的默认值。否则补偿跑昨天的任务时,会把今天的数据改写掉。

错过触发、重叠执行和阻塞策略

调度节点停机跨过触发点时,要事先决定是补跑、合并成一次,还是等到下一个周期。停机恢复后把错过的每个整点都补一遍,会连续打出几十次报表;完全不补,则当天的日结缺失。策略写在任务上,不用集群的全局默认蒙混过去。节点时钟不一致时,两个节点都可能认为自己该触发。执行权只能来自选举或数据库锁。

上一轮还没结束、下一轮又被触发,是长任务的常态。阻塞策略要写明:丢弃新的一轮、排队,或中止上一轮。中止若意味着杀掉正在写文件的进程,会留下写了一半的对象。排队若不限制长度,故障恢复后会堆成一长串补跑。执行记录要能看到第几次触发、分到哪一片、写了哪些键。失败事件交给告警微服务即可,不必在每个任务里各写一套通知。设备范围应读取设备管理系统的分组,避免在调度参数里复制一份已经过期的设备清单。

分片边界要用稳定的标识区间,不要用会随分页变化的行号。设备删除或新增之后,按页码切开的两片会重叠,或留下缝隙:同一台设备被巡检两次,另一台一次也没扫到。区间写进任务参数,并随执行记录保存。手工补跑时沿用当时的区间,不要按补跑当天的设备总数重新切页。


相关链接