看到一篇博文,做事风格不错。
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。非淡泊无以明志,非宁静无以致远。
原文:http://my.oschina.net/dubenju/blog/527727