一个简单的分布式 ID 实现


#软件架构与思考


实现方式

  1. 数据库表中分布式id的字段,加唯一索引。
  2. 分布式ID组成:时间 + UUID + 分库分表标识。例如 20221001-88affbadedba483db60814f8a3f49b06-010023

说明

  • 加时间前缀是为了保证id在时间维度是有序的,可以到日,也可以到小时或者分。
  • 表中字段加唯一索引,可以保证一个表内不会重复。
  • 分库分表标识,每个表之间是不一样的,所以可以保证表之间不会重复。也就保证了全局唯一。

数据库拆库可能遇到的问题

比如原本是10个库,发现不够用了,准备拆成50个库。如果分库分表的路由仅仅是基于分布式ID,那么没问题,存量数据还放在现有的库中即可。增量的放在新加的库中。

但是如果还基于其他的业务字段进行路由,比如用户id,那么:

  • 数据库拆分后,基于分布式ID路由和基于用户ID路由,只能保留一个路由方式,另外一个要废弃。
  • 分布式 ID 考虑换成绝对不会重复的实现。此时如何保证新的ID和旧的不会冲突? 新的长的不一样就行了,比如加一个字母前缀,比如 Bxxxxxx 。

( 本文完 )