如何在高并发分布式系统中生成全局唯一Id

原创
2015/11/08 17:00
阅读数 584

看到一篇博文,做事风格不错。

如何在高并发分布式系统中生成全局唯一Id

http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html

全篇转载就不厚道了,所以摘要了一下。

----------------------

如何在高并发分布式系统中生成全局唯一Id

1、  使用数据库自增Id

结论:适合小应用,无需分表,没有高并发性能要求。

2、  单独开一个数据库,获取全局唯一的自增序列号或各表的MaxId

结论:适用中型应用,此方案解决了分表,关联表插入记录的问题。但是无法满足高并发性能要求。同时也存在单点问题,如果这个数据库cash掉的话……

改进方案:

整体思想:建立两台以上的数据库ID生成服务器,每个服务器都有一张记录各表当前ID的MaxId表,但是MaxId表中Id的增长步长是服务器的数量,起始值依次错开,这样相当于把ID的生成散列到每个服务器节点上。例如:如果我们设置两台数据库ID生成服务器,那么就让一台的MaxId表的Id起始值为1(或当前最大Id+1),每次增长步长为2,另一台的MaxId表的ID起始值为2(或当前最大Id+2),每次步长也为2。这样就将产生ID的压力均匀分散到两台服务器上,同时配合应用程序控制,当一个服务器失效后,系统能自动切换到另一个服务器上获取ID,从而解决的单点问题保证了系统的容错。(Flickr思想)

但是要注意:1、多服务器就必须面临负载均衡的问题;2、倘若添加新节点,需要对原有数据重新根据步长计算迁移数据。

结论:适合大型应用,生成Id较短,友好性比较好。(强烈推荐)

3、  Sequence特性

结论:适用中型应用,此方案不能完全解决分表问题,而且无法满足高并发性能要求。同时也存在单点问题,如果这个数据库cash掉的话……

4、  通过数据库集群编号+集群内的自增类型两个字段共同组成唯一主键

结论:适合大型应用,但需要业务逻辑配合处理复合主键。

5、  通过设置每个集群中自增 ID 起始点(auto_increment_offset),将各个集群的ID进行绝对的分段来实现全局唯一。当遇到某个集群数据增长过快后,通过命令调整下一个 ID 起始位置跳过可能存在的冲突。

结论:适合大型应用,但需要高度关注各个集群 ID 增长状况。

6、  GUID(Globally Unique Identifier,全局唯一标识符)

结论:适合大型应用;生成的Id不够友好;占据了32位;索引效率较低。

7、  GUID TO Int64

结论:适合大型应用,生成相对友好的Id(纯数字)------因简单和业务友好性而推荐。

8、  自己写编码规则

结论:适合大型应用,从业务上来说,有一个规则的编码能体现产品的专业成度。(强烈推荐)

---------------------------------

其实是有人讨论过的,

http://www.oschina.net/question/1757031_2137794

速战速决,

聊以memo。非淡泊无以明志,非宁静无以致远。

展开阅读全文
打赏
0
20 收藏
分享
加载中
还是只会用自增的路过
2015/11/09 01:05
回复
举报
更多评论
打赏
1 评论
20 收藏
0
分享
返回顶部
顶部