分布式ID生成系统设计
分布式id系统要求
- 保证全局唯一,不会重复
- 生成的id有递增趋势,不是无序的字符串(可选)
- 性能高,可用性高(可选)
方案一、uuid生成
实现方式:
public static String getUuid(){
return UUID.randomUUID().toString();
}
优点:
- 实现简单,
- 性能高
缺点:
- 无序的字符串,不具备趋势自增特性
- 没有具体的业务含义
- 长度过长16字节128位,36位长度的字符串,存储以及查询对MySQL的性能消耗较大,MySQL官方明确建议主键要尽量越短越好,作为数据库主键 UUID 的无序性会导致数据位置频繁变动,严重影响性能
方案二、数据库自增ID
实现方式:
CREATE TABLE SEQID.SEQUENCE_ID (
id bigint(20) unsigned NOT NULL auto_increment,
value char(10)NOT NULL default '', PRIMARY KEY (id),
)ENGINE=MyISAM Comment '分布式id';
insert into SEQUENCE_ID(value) VALUES ('values');
优点:
- 实现简单,
- 自增有序
缺点:
- DB单点存在宕机风险,
- 无法扛住高并发场景
扩展方式