分布式系统中 Unique ID 的生成方法 (chenpeng.info)

【简介】

在分布式系统存在多个 Shard 的场景中, 同时在各个 Shard 插入数据时, 怎么给这些数据生成全局的 unique ID?

在单机系统中 (例如一个 MySQL 实例), unique ID 的生成是非常简单的, 直接利用 MySQL 自带的自增 ID 功能就可以实现.

但在一个存在多个 Shards 的分布式系统 (例如多个 MySQL 实例组成一个集群, 在这个集群中插入数据), 这个问题会变得复杂, 所生成的全局的 unique ID 要满足以下需求:

1、保证生成的 ID 全局唯一
2、今后数据在多个 Shards 之间迁移不会受到 ID 生成方式的限制
3、生成的 ID 中最好能带上时间信息, 例如 ID 的前 k 位是 Timestamp, 这样能够直接通过对 ID 的前 k 位的排序来对数据按时间排序
4、生成的 ID 最好不大于 64 bits
5、生成 ID 的速度有要求. 例如, 在一个高吞吐量的场景中, 需要每秒生成几万个 ID (Twitter 最新的峰值到达了 143,199 Tweets/s, 也就是 10万+/秒)
6、整个服务最好没有单点

如果没有上面这些限制, 问题会相对简单, 例如:

1、直接利用 UUID.randomUUID() 接口来生成 unique ID (http://www.ietf.org/rfc/rfc4122.txt). 但这个方案生成的 ID 有 128 bits, 另外, 生成的 ID 中也没有带 Timestamp
2、利用一个中心服务器来统一生成 unique ID. 但这种方案可能存在单点问题; 另外, 要支持高吞吐率的系统, 这个方案还要做很多改进工作 (例如, 每次从中心服务器批量获取一批 IDs, 提升 ID 产生的吞吐率)
3、Flickr 的做法 (http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/). 但他这个方案 ID 中没有带 Timestamp, 生成的 ID 不能按时间排序

在要满足前面 6 点要求的场景中, 怎么来生成全局 unique ID 呢?

Twitter 的 Snowflake 是一种比较好的做法. 下面主要介绍 Twitter Snowflake, 以及它的变种

点击查看原文 >>

@技术头条 2017-02-05 14:40 / 1个评论
赞过的人: @技术头条 @IT技术博客大学习
要不要再学学下面的文章?
一种在 Electron 和 Web 环境下显示原生及自定义菜单的通用方法 (innei.in)
在 Electron 和 Web 环境下如何统一展示原生和自定义菜单?本文提供了通用的解决方案,通过封装组件和调用方法,解决了两种环境下菜单交互不一致的问题。如果你正在开发跨平台应用,这篇文章能为你提供实用的开发技巧!
by @技术头条 2024-09-09 23:44 查看详情
如何用简单的Web方法实现图片的马赛克效果 (www.zhangxinxu.com)
文章介绍了如何通过简单的Web技术实现图片的马赛克效果。作者主要讨论了使用SVG滤镜来实现此效果,尤其是通过使用像<feFlood>、<feComposite>和<feMorphology>等SVG元素。此外,文章还探讨了通过CSS属性image-rendering: pixelated来模拟马赛克效果的方法,即通过放大小图片来达到效果。文中提供了详细的示例和代码片段来帮助实现这些效果。
by @技术头条 2024-08-06 07:48 查看详情
重复视频检测的价值和常见方法 (ixyzero.com)
全网范围内的主要精品视频主要来自MCN机构,一些公司为了更快更好地去覆盖全网内容,会选择和内容代理合作,而代理手上会有很多重复版权的内容,导致重复内容出现。另外,搬运视频也会导致重复内容出现,这些重复内容会造成极差的用户体验。

再者,大量内容相似的视频对于短视频平台存储、网络带宽等资源也是一个极大的挑战,为了不必要的资源浪费,对视频内容进行去重是非常有必要的。
by @技术头条 2024-03-13 13:24 查看详情
浅谈安全方向的学习方法 (www.hackerpoet.com)
最近经历了一次ctf培训之后,突然对安全学习有了一点新的理解,所以写下文章来记录。
by @技术头条 2024-03-10 19:36 查看详情
利用gorm自身提供的方法实现存在更新不存在则创建的能力 (wiki.eryajf.net)
MySQL 有一个语句是 UPSERT 的操作,它结合了 update 和 insert 两种操作的功能。当执行 upsert 操作时,如果指定的记录已经存在,则执行更新操作;如果指定的记录不存在,则执行插入操作。这种操作可以用来确保数据的一致性,并且可以减少对数据库的访问次数。
by @技术头条 2024-01-13 23:49 查看详情
基于UI交互意图理解的异常检测方法 (tech.meituan.com)
美团到店平台技术部/质量工程部与复旦大学周扬帆教授团队开展了科研合作,基于业务实际场景,自主研发了多模态UI交互意图识别模型以及配套的UI交互框架。本文从大前端质量保障领域的痛点出发,介绍了UI交互意图识别的方法设计与实现。基于UI交互意图编写的测试用例在实际业务中展现出了可以跨端、跨App的泛化能力,希望可以为从事相关工作的同学带来一些启发或帮助。
by @技术头条 2023-11-29 23:40 查看详情
Java自带的4种字符串组织和格式化方法 (blog.didispace.com)
在Java中,组织字符串是平时最常见的操作,这里总结一下Java自带的四种处理方式。
by @技术头条 2023-08-26 21:53 查看详情
除了升职加薪,激励员工还有别的方法吗 (hiwannz.com)
“让大多数人做自己有兴趣的事情,并且还能获得回报”才是工作的意义所在,而“让正确的人在正确的位置做正确的事”则是管理的意义所在。
by @技术头条 2023-08-18 23:05 查看详情
99%的互撕场景,都可以用这个方法解决 (blog.csdn.net)
我们每天都会遇到的问题相信稍微在职场上工作几年的同学,都会遇到责任扯皮问题。这个事该你做,不该我做,这个问题是你的责任不是我的责任。尤其是,有时候冲突双方都觉得自己有理。

有一个解决问题的利器——汉德公式:谁避免意外的成本最低,谁的责任就最大。
by @技术头条 2023-07-23 11:35 查看详情
软件开发 | 服务器推送事件:一种从服务器流式推送事件的简易方法 (linux.cn)
昨天见识到了一种从没见过的从服务器推送事件的炫酷方法:服务器推送事件server-sent events!如果你只需要让服务器发送事件,相较于 Websockets,它们或许是一个更简便的选择。本文聊一聊它们的用途、运作原理,以及昨日在试着运行它们的过程中遇到的几个错误。
by @技术头条 2023-06-24 23:32 查看详情
尼莫船长

怎么看后面的内容呢

by @尼莫船长 2017-10-31 19:55