知识卡片

分片项作为纯逻辑概念,用自定义参数与业务语义解耦

普通读书笔记卡

内容

一个容易被误解的设计细节是:Elastic-Job的任务分片项本身只是一个抽象的数字序号(0、1、2……),框架自身完全不知道、也不关心这个序号在业务上对应什么,分片和实际数据之间不存在任何天然的匹配关系——这个匹配关系必须由使用方自己去建立。最朴素、但也最糟糕的接入方式是在业务代码里直接写if (shardingItem==1){do xxx} else if (shardingItem==2){do xxx}这种硬编码分支,代码可读性差、扩展新分片时还要改代码。Elastic-Job给出的更好方案是提供自定义参数机制,让分片序号可以映射成有业务含义的枚举值(比如把1映射成”北京”、2映射成”上海”),业务代码只需要根据映射后的语义值(北京/上海)去查询对应仓库的数据,而不需要直接和裸的数字序号打交道。更重要的一条实践经验是:应当让作业的分片规则和数据中间层(分库分表规则)保持一致对应,这样一个分片项处理的数据范围就正好对应底层某个物理分片,避免作业分片之后还要在业务代码里再做一层数据路由的适配。这个设计提示了一条更通用的框架设计原则:框架层提供的调度能力(分片、并行)应该尽量保持语义中立、不预设业务含义,把”数字序号到底代表什么”这层翻译显式地交给使用方通过配置去完成,这样框架才能保持通用性,同时避免业务语义硬编码进调度逻辑里导致代码难以维护。

参考来源

- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.6 新一代分布式任务调度框架:当当Elastic-Job开源项目的10项特性"节,"2.6.5 Elastic-Job的部署和使用"(源文件:_epub-src/OEBPS/Text/Chapter2_6_6.xhtml) - 结论依据:原文说明"作业分片只是个逻辑概念,分片和实际数据其实是不做任何匹配关系的……Elastic-Job提供了自定义参数,可将分片项序号和实际业务做映射。比如设置为1=北京,2=上海",并强调"最佳实践是将作业分片项规则和数据中间层规则对应",直接支撑本卡片结论。 - 原始内容:作业分片只是个逻辑概念,分片和实际数据其实是不做任何匹配关系的……为了不让代码写起来很无聊,看起来像 if (shardingItem==1){do xxx}else if (shardingItem==2){do xxx}那样,Elastic-Job提供了自定义参数,可将分片项序号和实际业务做映射。