2026/1/8 15:00:59
网站建设
项目流程
建立网站的工具,域名 空间 建网站,南联企业网站建设,vs网站开发表格大小设置来源#xff1a;juejin.cn/post/7507203999102648360#x1f449; 欢迎加入小哈的星球#xff0c;你将获得: 专属的项目实战#xff08;多个项目#xff09; / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论新项目#xff1a;《Spring AI 项目实战》正在更…来源juejin.cn/post/7507203999102648360 欢迎加入小哈的星球你将获得:专属的项目实战多个项目 / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论新项目《Spring AI 项目实战》正在更新中..., 基于 Spring AI Spring Boot 3.x JDK 21;《从零手撸仿小红书微服务架构》 已完结基于 Spring Cloud Alibaba Spring Boot 3.x JDK 17..., 点击查看项目介绍演示地址http://116.62.199.48:7070/《从零手撸前后端分离博客项目全栈开发》2期已完结,演示链接http://116.62.199.48/;专栏阅读地址https://www.quanxiaoha.com/column截止目前累计输出 100w 字讲解图 4013 张还在持续爆肝中..后续还会上新更多项目目标是将 Java 领域典型的项目都整一波如秒杀系统, 在线商城, IM 即时通讯Spring Cloud Alibaba 等等戳我加入学习解锁全部项目已有4100小伙伴加入最近我们线上系统发生了一起严重事故订单号/流水号出现了重复影响了核心业务流程。最终定位到根源一个自研的二方包雪花算法ID生成器出现了问题。下面我们来回顾一下雪花算法的标准结构分析问题出在哪并总结一些通用的设计建议。一、标准雪花算法Snowflake标准的Snowflake ID由一个64位long型整数构成---------------------------------------------------------------------------------------------------- | 1 Bit | 41 Bits 时间戳 | 5 Bits 数据中心ID | 5 Bits 机器ID | 12 Bits 序列号 | ----------------------------------------------------------------------------------------------------1位符号位始终为0确保生成正数。41位时间戳记录与固定起始时间的毫秒差可支持约69年。10位机器ID用于标识不同节点。12位序列号在同一毫秒内生成多个ID时使用最多支持每毫秒生成4096个ID。优点高性能生成唯一ID按时间有序适用于分布式环境。二、我们的“定制版”雪花算法问题在哪我们使用的二方包雪花算法结构如下根据排查推测---------------------------------------------------------------------------------------------------- | 31 Bits 时间戳Delta | 13 Bits 数据中心ID | 4 Bits 工作ID | 8 Bits 业务ID | 8 Bits 序列号 | ----------------------------------------------------------------------------------------------------看起来字段丰富但存在严重问题1. 时间戳仅保留31位最多支持24.85天左移33位后只用31位时间戳超过 2^31 毫秒后开始循环我们自定义的起始时间是2018年2025年时早已绕了无数圈。2. BusinessId 用的是 IP 最后一段使用的IPy用点分隔的最后一位即192.168.0.1的1极容易重复。3. WorkId 和 DataCenterId 未配置全为0相当于所有实例共享同一节点标识唯一性形同虚设。“最终结果时间轮回 IP冲突 序列重复ID彻底撞车。三、教训总结通用组件不建议自研雪花算法涉及时钟回拨、位运算、分布式协调等关键细节成熟组件更稳妥。不盲信二方包无论谁写的代码都要看清实现逻辑理解其唯一性保障机制。合理设置机器ID靠IP后缀太脆弱建议集中规划统一分配Worker ID和DataCenter ID。提前覆盖边界场景模拟长时间运行、序列号溢出、时间回拨等极端情况确保系统稳健。四、推荐做法使用成熟的开源实现如 Hutool、Baomidou 等// Hutool 示例 Snowflake snowflake IdUtil.getSnowflake(1, 1); long id snowflake.nextId(); // Baomidou 示例支持从 IP/MAC 自动推导也可手动指定 DefaultIdentifierGenerator generator new DefaultIdentifierGenerator(1, 1); // workerId1, dataCenterId1 long id generator.nextId(user);对于中大型系统DataCenterId 一般用来标识不同的机房或者 AZ (Availability Zone)。WorkerId 的配置策略可以根据系统规模逐步演进简单方式通过配置文件手动指定。这种方式配置简便适用于开发环境或单机部署。标准方式将 IP 与端口号或进程号拼接后进行哈希再对 WorkerId 总数取模。具备一定自动化能力不依赖外部系统适用于中小规模部署。中级方案依赖注册中心如 Eureka、Nacos在服务注册时分配编号结合服务ID保障唯一性。高级方案使用 Redis、Zookeeper 等集中协调 WorkerId 分配与释放支持动态扩容、避免冲突。随着系统规模扩大推荐逐步引入更复杂但更稳妥的机制避免一开始就过度设计。五、其它建议不要将业务标志拼入ID中有时我们为了确保唯一性会试图将业务信息如类型前缀、模块编号拼接进ID。但这种做法会带来一系列问题会导致 ID 非全数字失去原本按时间递增的排序特性影响数据库索引效率ID长度变得不规则或偏长可能增加存储成本也会影响日志展示、用户体验若业务字段含义变动还可能造成数据兼容性问题。更稳妥的做法是将业务字段单独存储ID仅用于唯一标识和排序。六、结语别为造轮子而造轮子尤其在通用组件上不可抱侥幸心理。 欢迎加入小哈的星球你将获得:专属的项目实战多个项目 / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论新项目《Spring AI 项目实战》正在更新中..., 基于 Spring AI Spring Boot 3.x JDK 21;《从零手撸仿小红书微服务架构》 已完结基于 Spring Cloud Alibaba Spring Boot 3.x JDK 17..., 点击查看项目介绍演示地址http://116.62.199.48:7070/《从零手撸前后端分离博客项目全栈开发》2期已完结,演示链接http://116.62.199.48/;专栏阅读地址https://www.quanxiaoha.com/column截止目前累计输出 100w 字讲解图 4013 张还在持续爆肝中..后续还会上新更多项目目标是将 Java 领域典型的项目都整一波如秒杀系统, 在线商城, IM 即时通讯Spring Cloud Alibaba 等等戳我加入学习解锁全部项目已有4100小伙伴加入1. 我的私密学习小圈子从0到1手撸企业实战项目~ 2. Spring Task定时任务3行代码解放双手告别重复劳动 3. JDK25都出来了但为什么很多公司还在坚持用JDK8 4. 面试官Git 如何撤回已 Push 的代码问倒一大片。。。最近面试BAT整理一份面试资料《Java面试BATJ通关手册》覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式点“在看”关注公众号并回复 Java 领取更多内容陆续奉上。PS因公众号平台更改了推送规则如果不想错过内容记得读完点一下“在看”加个“星标”这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀谢谢啦