微服务架构从0到1:Go语言分布式ID生成器实战指南
1. 为什么微服务不能直接用数据库自增ID?
在传统单体应用中,数据库自增ID是一个简单有效的方案。但在微服务架构下,这条路却走不通了。
核心问题在于:当我们将一个系统拆分为多个微服务,每个服务可能拥有独立的数据库实例,甚至同一个服务也会分库分表。假如订单服务和用户服务各自生成自增ID,两个服务都可能产生ID=1的记录——这就会造成全局ID重复-6。
更棘手的是分库分表场景。假设用户表分成了10个库,每个库的用户ID都从1开始自增。当我们需要根据ID查询某个用户时,由于ID本身不包含分片信息,只能把请求广播到所有分片,性能损耗极大。如果说分库分表中间件(如ShardingSphere)依赖ID本身做路由,若ID不带分片信息或无序,会导致路由失效-6。
自增ID在微服务中的具体问题
| 问题 | 说明 |
|---|---|
| 跨实例重复 | 多个数据库实例各自从1开始递增,导致ID冲突 |
| 路由失效 | ID不含分片键信息,无法直接定位数据所在分片 |
