
背景基因法将分片信息注入到非分片键中让非分片键携带路由信息。比如分片键是用户id那么订单号就加入用户id分片信息。但是如果出现节点挂了或者是数据倾斜以及扩容需要迁移数据等问题时将无法解决。所以需要使用映射覆盖方案在中间件层设置一个优先级高的本地热迁移配置。如果设置了配置那么就强制使用配置中的路由否则就使用id中的。具体实现数据结构使用长度为1024的原子性数组。为什么不使用map呢因为使用数组可以直接通过下标获取到数据性能更好。并且没有哈希碰撞。数组下标是表的编号存的只是库名或者是策略。{type: sub_shard,sub_count: 8,algorithm: hash(user_id) % 8}路由执行逻辑。中间件在进行路由的时候先去查覆盖层发现不为空就去执行策略找的真正的表。举例订单表一开始是按照店铺去拆分的。但是某个店铺订单量很大所以出现了数据倾斜。那么我们可以再将这个表再拆分为很多个小表并且把数据迁移到那些小表里面。那我们数组里面存的就是这些小表的路由策略。数据查询比如我们要查询某个店铺某个用户的订单我们先通过店铺去查到订单然后再去覆盖层找到对应的路由去查询对应的表。但如果是想要查询某个店铺当天的订单就只能广播查询该店铺下所有子表再在内存里聚合。但是这样的话性能可能就没有那么好建议引入es 。