http://blog.yxwang.me/2012/08/twitter-snowflake/

这是一篇两年前 Twitter 开发团队写的文章,今天挖出来研究了一下。原文地址 http://engineering.twitter.com/2010/06/announcing-snowflake.html

Twitter 早期用 MySQL 存储数据,随着用户的增长,单一的 MySQL 实例没法承受海量的数据,开发团队就开始用 Cassandra 和 sharded MySQL 替代原有的系统。然而和 MySQL 不同的是,Cassandra 没有内置为每一条数据生成唯一 ID 的功能,因为在一个分布式环境下,很难有完美的 ID 生成方案。

对于 Twitter 而言,这样的 ID 生成方案要满足两个基本的要求,一是每秒能生成几十万条 ID 用于标识不同的 tweet;二是这些 ID 应该可以有个大致的顺序,也就是说发布时间相近的两条 tweet,它们的 ID 也应当相近,这样才能方便各种客户端对 tweet 进行排序。

第一个要求意味着 ID 生成要以一种非协作的(uncoordinated)的方式进行,例如不能有一个全局的原子变量。

第二个要求使得 tweet 按 ID 排序后满足 k-sorted 条件。如果序列 A 要满足 k-sorted,当且仅当对于任意的 p, q,如果 1 <= p <= q - k (1 <= p <= q <= n),则有 A[p] <= A[q]。换句话说,如果元素 p 排在 q 前面,且相差至少 k 个位置,那么 p 必然小于或等于 q。如果 tweet 序列满足这个条件,要获取第 r 条 tweet 之后的消息,只要从第 r - k 条开始查找即可。

Twitter 解决这两个问题的方案非常简单高效:每一个 ID 都是 64 位数字,由时间戳、节点号和序列编号组成。其中序列编号是每个节点本地生成的序号,而节点号则由 ZooKeeper 维护。

具体的参数可以在这个 IdWorker.scala 中看到。序列编号有 12 位,意味着每个节点在每毫秒可以产生 4096 个 ID。节点号在源码中被分成两部分,数据中心的 ID 和节点 ID,各自占 5 位。时间戳则是记录了从 1288834974657 (Thu, 04 Nov 2010 01:42:54 GMT) 这一时刻到当前时间所经过的毫秒数,占 41 位(还有一位是符号位,永远为 0)。

Twitter Snowflake相关推荐

  1. 分布式全局序列号生产,Twitter Snowflake算法,雪花算法

    为什么80%的码农都做不了架构师?>>>    snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 00000 ...

  2. Twitter Snowflake 主键生成

    http://blog.yxwang.me/2012/08/twitter-snowflake/ 这是一篇两年前 Twitter 开发团队写的文章,今天挖出来研究了一下.原文地址 http://eng ...

  3. Twitter Snowflake算法详解

    2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/zyt425916200/article/details/52775542 转载于: ...

  4. Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

    在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12 ...

  5. Twitter的分布式自增ID算法snowflake (Java版)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  6. Twitter的分布式自增ID算法snowflake

    全局ID 要做到幂等性的交易接口,需要有一个唯一的标识,来标志交易是同一笔交易.而这个交易ID由谁来分配是一件比较头疼的事.因为这个标识要能做到全局唯一. 如果由一个中心系统来分配,那么每一次交易都需 ...

  7. [详解]Twitter开源分布式自增ID算法snowflake,附演算验证过程

    1.snowflake简介 互联网快速发展的今天,分布式应用系统已经见怪不怪,在分布式系统中,我们需要各种各样的ID,既然是ID那么必然是要保证全局唯一,除此之外,不同当业务还需要不同的特性,比如像并 ...

  8. snowflake做主键 自增_自增ID算法snowflake - C#版

    急景流年,铜壶滴漏,时光缱绻如画,岁月如诗如歌.转载一篇博客来慰藉,易逝的韶华. 使用UUID或者GUID产生的ID没有规则 Snowflake算法是Twitter的工程师为实现递增而不重复的ID实现 ...

  9. 【分布式ID】理解Snowflake算法的实现原理

    1.概述 转载:冷饭新炒:理解Snowflake算法的实现原理 我上次也看了一个视频讲解:[分布式ID]键高并发 分布式 全局唯一 ID 雪花算法 snowflake 2.前提# Snowflake( ...

最新文章

  1. 毫米波雷达的市场格局及后续发展趋势
  2. 牛客题霸 二分查找 C++题解/答案
  3. centos7-安装mysql5.6.36
  4. php置顶文章,php实现文章置顶功能的方法
  5. 怎么将一个数字高低位互换_多彩数字 多彩童年——东城幼儿园玩具研究教学案例...
  6. sun工作站linux,LINUX SUN Solaris 8操作系统安装指导书.doc
  7. CentOS下rsync数据同步备份
  8. ubuntu无法激活输入法,Zendstudio无法激活中文输入法问题
  9. 如何从基础到深入了解java构造器
  10. SharePoint读取和设置列表栏的内容
  11. 侧方位停车技巧图解 教你快速便捷停车(图)
  12. Android 启动过程介绍
  13. 掌上医院:手机生活助手
  14. 关于python使用pandas导入dat数据文件的方法(可导入任意dat数据文件和csv数据文件)
  15. Linux命令之logrotate命令
  16. kali 局域网断网
  17. 数据结构 day07 基础知识学习 (二叉树 的 前中后遍历 ,插入节点,删除叶子节点, 二叉树的节点个数 )
  18. 基于51单片机的自动窗帘控制系统
  19. 成都Uber优步司机奖励政策(1月17日)
  20. 交公粮了:我经常逛的技术网站

热门文章

  1. 对实体 quot;useSSLquot; 的引用必须以 ';' 分隔符结尾
  2. 【小白学习keras教程】三、Kears中常见模型层Padding、Conv2D、MaxPooling2D、Flatten和Dense
  3. 爬取了京东商城上的部分手机评论数据,仅供学习使用
  4. hdfs namenode -format 初始化创建不了目录的问题
  5. 五、开始Github和码云之旅,新手如何上路
  6. sklearn数据预处理
  7. 不再内卷!视觉字幕化新任务合集
  8. 探秘 | 平安人寿人工智能研发团队北京研发中心
  9. HihoCode1721删除一个字符之后是回文字符串
  10. ceph-deploy mod add_GTA5 1.50NPC自杀 MOD [支持1.411.50版本] 覆盖版【5.19MB】