XXL-Job 分片广播底层机制

📅 2026/6/27 11:08:09
XXL-Job 分片广播底层机制
分片广播的本质是调度中心把分片序号作为参数下发执行器根据参数自行过滤数据不存在跨节点数据流转调度器和执行器之间只有一次 RPC触发执行没有数据交换。1. 调度中心怎么下发分片参数调度中心 执行器集群 | | |──── triggerShardJob(shardIndex) ──→| | shardTotal 4 | | shardIndex 0/1/2/3 | | | ←──── 执行完成 结果 ──────────────|关键点调度中心按分片序号逐个触发每次 RPC 只传shardTotal和shardIndex两个 int 参数不传数据4 个分片 4 次独立 RPC 调用和普通任务触发的区别只是带了分片参数路由策略如 first、last是普通集群调度用的分片广播下不生效2. 执行器端 ShardingContext 的来源和生命周期调度中心 执行器 | | | triggerShardJob(index2,total4) | ← RPC 触发时传入 | ────────────────────────────────→| | | 解析成 ShardingVO | | 存入 ThreadLocal调度中心 RPC 调用执行器时把index和total两个 int 传过来执行器端解析成ShardingVO存进ThreadLocal代码里ShardingUtil.getShardingVO()就是从这里取的。// 触发时调度中心 RPC → XxlJobExecutor.execute() // → 传入 ShardingVO(shardIndex, shardTotal) // → 存入 ThreadLocal: XxlJobThreadLocal // 代码里获取 ShardingVO vo ShardingUtil.getShardingVO(); // 底层就是从 ThreadLocal 取的 // 执行完成后ThreadLocal 清空生命周期 一次任务执行生命周期随 RPC 调用开始随任务执行完毕/失败结束存于线程级别 ThreadLocal和 Spring 容器无耦合。3. 和其他框架分片机制对比框架分片策略数据分片一致性 hashXXL-Job广播触发 执行器本地过滤需要业务侧自己算无Elastic-JobZooKeeper 协调分配分片序号框架自动按分片取数据支持ShardingSphere 项目里用SaturnQuartz 改造容器层分配容器统一分片下发无PowerJobMMSMapReduceMaster统一分配支持 MapReduce 编程模型无核心区别Elastic-Job 的分片结果存在 ZooKeeper 里各执行器去抢XXL-Job 是调度中心逐个触发分片数据在执行器本地算无中心协调。4. 一致性 hash 在分片广播里的应用XXL-Job 本身没有用一致性 hash但业务侧实现分片时经常用到// 取模分片简单但扩缩容要重跑全量 int shard userId.hashCode() % shardTotal; // 一致性 hash扩缩容影响小但实现复杂 int shard consistentHash(userId, shardTotal);结论框架层面没有业务侧按需自行实现。一致性 hash 主要用于动态扩容不大量重分片的场景但 XXL-Job 的分片序号是启动时固定的实际生产中很少在任务代码里动态调整分片数。XXL-Job 分片广播的底层机制是调度中心按分片序号逐个 RPC 触发执行器传入 shardTotal 和 shardIndex 两个参数执行器本地根据参数过滤数据执行全程只有一次 RPC 调用触发没有数据跨节点流转。这和 Elastic-Job 的 ZK 协调分配有本质区别——XXL-Job 是无中心的执行器自主计算调度中心只负责触发。