集群部署id重复问题
容器集群部署三个服务,做负载均衡同时插入数据时,使用的是mybatis-plus的id生成策略采用的雪花算法根据InetAddress进行生成
本以为每个容器ip不同就不会出现id重复问题!
但是进入源码发现DefaultIdentifierGenerator 的 InetAddress 构造方法是通过将 IP 地址转换为一个长整数,然后对 31 取模来生成数据中心 ID 和工作机器 ID 的。这是因为在雪花算法(Snowflake)中,数据中心 ID 和工作机器 ID 的位数分别被限制为 5 位和 5 位,所以它们的最大值都是 31。


所以会存在一定几率DatacenterId和WorkerId (根据DatacenterId和进程pid计算后对31取模)一样的情况。在大量数据同时插入时就会存在id重复问题!
解决办法
在github中有一个很流行的分布式统一ID生成框架也叫idworker,需要和mybatis-plus中自带的Idworker工具类区分开来。它是一个基于zookeeper和snowflake算法的分布式统一ID生成工具,通过zookeeper自动注册机器(最多1024台),无需手动指定workerId和dataCenterId。idworker官网:https://github.com/imadcn/idworker
3654

被折叠的 条评论
为什么被折叠?



