是什么?
多个进程生成唯一id。
怎么生成?
其实,具体的id生成是有一些诀窍的,就是有一些基本的要求,对应这些基本的要求,你就知道需要哪些字段组成id。
要求
1.时间
2.唯一
所以,包含字段
1.时间
2.mac地址
具体的解决方案如下几种。
UUID
其实,就跟普通的id一样,确保唯一就可以了。
比如,UUID就可以。
缺点
就是太长了,32个16进制+4个-,总共46个字符。
其他方案twitter 雪花snowflake
比如,雪花snowflake解决方案,Mongdb objectID。
其实,都和UUID差不多。就是由几个要素字段组成。
优点
长度比UUID短一点。
数据库
基于数据库id自增。
就是可以从数据库获取唯一自增id的那种功能,mysql oracle都有提供。
如果要集群,那么不同的机器1.初始起始值不一样2.递增间隔值一样
例子
1.两个节点
节点1
初始值1 步长2
节点2
初始值1 步长2(步长都为2)
所以,结果就是
1 3 5 7 9
2 4 6 8 10 //一个是奇数,一个偶数
2.三个节点
3.N个节点
4.扩容
需要重新调整初始值和步长。具体步骤:
1)新的节点
规划好几个节点的初始值和步长。
设置新的节点的初始值和步长。
设置一个大的初始值,没使用的大的初始值。
2)旧的节点
调整初始值和步长
3)重复12步骤
方案一:利用数据库的自增ID,从1开始,基本可以做到连续递增。Oracle可以用SEQUENCE,MySQL可以用主键的AUTO_INCREMENT,虽然不能保证全局唯一,但每个表唯一,也基本满足需求。
数据库自增ID的缺点是数据在插入前,无法获得ID。数据在插入后,获取的ID虽然是唯一的,但一定要等到事务提交后,ID才算是有效的。有些双向引用的数据,不得不插入后再做一次更新,比较麻烦。
美团leaf
两种
1.基于数据库
2.基于雪花snowflake
数据库
之前是,每次获取id,都要读写/访问数据库。
现在,使用中介(即美团leaf),一次获取多个(比如,步长是1000),那么现在1000个数据只需要访问一次数据库。
那么如何保证这1000个数据的同步呢?
1.首先,这1000个数据肯定是存储在内存
2.其次,这1000个数据,其实就是一个数据变量 + 步长控制到1000,每次访问自增,但是要确保数据的线程安全,具体就是使用同步。
同步这个工作,由美团leaf实现,无需应用层担心线程安全问题。
雪花snowflake
因为数据库是基于递增,所以透露了订单号和订单数量。
雪花方案,就是让数据无序。
因为雪花方案是mac + 时间等字段组成。
怎么存储?
内存。或者数据库。
反正,就是读的时候,再取就可以了。
支付
分布式事务,需要一个唯一id,来唯一标识事务。
总结
怎么生成分布式id,其实无所谓。只要唯一就可以了。
为什么无所谓呢?因为生成id跟分布式没有什么关系。
如果实在要考虑多进程即分布式的id唯一?
可以借用第三方软件中间件生成一个唯一id,引入第三方软件中间件,
第一,大家各个进程都可以访问;
第二,独立的第三方软件确保id唯一。
最后,实践当中,具体什么级别的系统,应该采用哪种解决方案的思路,参考廖雪峰老师的文章!
参考
www.liaoxuefeng.com/article/128… //非常好的文章!一切从实战出发。
tech.meituan.com/2017/04/21/… //美团交易量大,一般的系统根本不需要搞那么麻烦。
juejin.cn/post/684490… juejin.cn/post/684490…
m.w3cschool.cn/architectro… gavinlee1.github.io/2017/06/28/…