文档章节

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

如比如比
 如比如比
发布于 2015/11/08 17:00
字数 902
阅读 539
收藏 21

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

如何在高并发分布式系统中生成全局唯一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。非淡泊无以明志,非宁静无以致远。

© 著作权归作者所有

上一篇: Objective-c(1)
下一篇: BigDecimal
如比如比
粉丝 127
博文 178
码字总数 286951
作品 0
日本
程序员
私信 提问
加载中

评论(1)

啦啦啦拉拉
啦啦啦拉拉
还是只会用自增的路过
php UUID &分布式生成用不重复的随机数方法

UUID(Universally Unique Identifier),通用唯一识别码。 UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的 UUID 由以下几个部分组成: 1)当前日期和时间 2)时钟...

SibylY
2018/04/26
426
0
【迁移2018-05-08 14:14:27】全局唯一ID生成

唯一ID生成 全局唯一ID 《高并发分布式系统中生成全局唯一Id汇总》 Twitter 方案(Snowflake 算法):41位时间戳+10位机器标识(比如IP,服务器名称等)+12位序列号(本地计数器) Flicker 方案...

twentwo
2018/08/10
69
0
通俗易懂:如何设计能支撑百万并发的数据库架构?

本文引用自“孤独键客”的原创文章“支撑百万并发的数据库架构如何设计?”,内容有修订和改动,感谢原作者的技术分享。 1、引言 相信看到这个标题,很多人的第一反应就是:对数据库进行分库...

JackJiang2011
05/15
0
0
通俗易懂:如何设计能支撑百万并发的数据库架构?

1、引言 相信看到这个标题,很多人的第一反应就是:对数据库进行分库分表啊!但是实际上,数据库层面的分库分表到底是用来干什么的,其不同的作用如何应对不同的场景,我觉得很多同学可能都没...

首席大胸器
05/15
147
0
如何在高并发分布式系统中生成全局唯一Id

又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上。最近还写了一个发邮件的组件以及性能测试请看 《NET开发邮件发送功能的全面教程(含邮件组件源码)》 ,还...

shezjl
2015/05/22
870
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部