分布式ID方案选择
UUID
-
UUID
是通用唯一识别码(Universally Unique Identifier
)的缩写,开放软件基金会(OSF
)规范定义了包括网卡MAC
地址、时间戳、名字空间(Namespace
)、随机或伪随机数、时序等元素。利用这些元素来生成UUID
。 -
UUID
是由128位二进制组成,一般转换成十六进制,然后用String
表示。
550e8400-e29b-41d4-a716-446655440000
UUID
的优点
- 通过本地生成,没有经过网络
I/O
,性能较快; - 无序,无法预测他的生成顺序。(当然这个也是他的缺点之一)
UUID
的缺点
- 128位二进制一般转换成36位的16进制,太长了只能用
String
存储,空间占用较多; - 不能生成递增有序的数字;
数据库主键自增
- 大家单一唯一标识最容易想到的就是主键自增,这个也是我们最常用的方法。例如我们有个订单服务,那么把订单
id
设置位主键自增即可。
- 单独数据库记录主键;
- 业务数据库分别设置成不同的自增起始值和固定步长,如:
第一台 start 1 step 9
第二台 start 2 step 9
第三台 start 3 step 9
优点
- 简单方便,有序递增,方便排序和分页;
缺点
- 分库分表会带来问题,需要进行改造;
- 并发性不高,容易受限于数据库的性能;
- 简单递增容易被其他人猜测利用,比如:你有一个用户服务用的递增,那么其他人可以根据分析注册的用户
ID
来得到当天你的服务有多少人注册,从而就能猜测出你这个服务当前的一个大概状况。 - 数据库宕机服务不可用。