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. 分布式主键生成设计策略

    1 写作目的 这几天被虾皮裁员的消息刷屏了,实话实说互联网的行情确实很差,各处都在裁员.而且最近在忙试用期转正答辩,还不错,光荣的成为了一个大厂的正式员工,很庆幸在这么不稳定的情况下还能有自己的一寸方 ...

  2. MyBatisPlus主键生成策略

    简介 我们可以通过 @TableId 注解的 type 属性来设置主键 id 的增长策略,一共有如下几种主键策略,可根据情况自由配置. AUTO(数据库 ID 自增) 对于像 MySQL 这样的支持主 ...

  3. 雪花算法及分布式主键生成策略详解

    目前雪花算法常应用于分布式环境下作为分布式主键的首选,本文详细介绍下雪花算法及相关分布式主键的生成策略. 如下内容已本文PPT讲解内容为基础. 本次内容共包括4部分:分布式主键生成策略,雪花算法详解, ...

  4. Hibernate主键生成种类

    Hibernate实体类的*.hbm.xml配置文件: 一个参考例子: <hibernate-mapping> <!-- name:实体Bean,即类名 table:实体Bean对应 ...

  5. Hibernate的increment主键生成机制带来的问题

    最近给学校做的系统,总出现主键插入冲突的问题.主键是通过hibernate自动生成的,设置increment属性,总出现Duplicate entry的错误.搜到解决方案如下: 在网站运行在apach ...

  6. JBPM对象主键生成机制

       什么是主键 我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引.因为主键可以唯一标识某一行记录,所以可 ...

  7. hibernate 7大主键生成策略详解与对象状态

    一:代理主键_主键自增 1.identity 1.采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型 2.该生成器要求在数据库中把主键定义成为自增长类型.适用于代理主键 2.in ...

  8. Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  9. hibernate之主键生成策略

    一.主键类型 1.自然主键(主键本身就是表中的一个字段,实体中一个具体的属性) 表中已经具有某字段,并且该字段具有业务含义作为主键,称之为自然主键. 例如:在person表中的身份证号,既是唯一的,又 ...

最新文章

  1. Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile)
  2. Selenium3自动化测试——12.上传文件功能
  3. nyc检测Javascript代码覆盖率
  4. 1.在VS2010中文版中开发WP7程序
  5. ArrayList LinkedList与HashMap 实现原理
  6. 业界首个高性能交互式自动标注工具EISeg正式开源,跨越式提升你的标注体验...
  7. js中立即执行函数会预编译吗_JavaScript预编译过程
  8. java 字符转换为数字_JAVA中使用字符串转换为数字
  9. Javascript中交换两个变量值的十种方法相关笔记(一)
  10. 编译Android源码:Exception in thread main java.lang.UnsupportedClassVersionError:报错解决
  11. python之读取文本操作
  12. eclipse svn 忽略 target/.project /.classpath /.settings等 目录
  13. 系统科学专业 计算机,2018年北京市培养单位数学与系统科学研究院863计算机学科综合(专业)之计算机操作系统考研核心题库...
  14. Git 命令 clone、add、status、commit、push、init 使用介绍.
  15. 经典的CSS代码(转)
  16. Python的崛起,百万程序员被影响?真相……
  17. python:实现牛顿法算法(附完整源码)
  18. python数据分析案例-利用生存分析Kaplan-Meier法与COX比例风险回归模型进行客户流失分析与剩余价值预测
  19. 解决 chorm adobe flash过期
  20. 【附源码】计算机毕业设计java在线学习系统的设计与开发设计与实现

热门文章

  1. python ssl unverified context
  2. MobileNet 进化史: 从 V1 到 V3(V1篇)
  3. 电商系统——优惠券核销(四)
  4. 基于SSM的健身房系统的设计与实现
  5. 洛谷——P4817 [USACO15DEC]Fruit Feast G
  6. 有意思的it企业命名!
  7. 黑马旅游网中的BUG
  8. Android 项目 sdk导入腾讯云cos:
  9. win7连接xp远程桌面
  10. n皇后问题 递归和非递归