Twitter 推出的 Snowflake 是一个非常实用的分布式ID生成方案。它的默认设置中,各部分信息所占比特位比较有代表性,通常无需二次定制。但是对于 datacenter id 和 worker id 的维护需要各项目自行设计方案。
通常,datacenter id 是固定的,一旦为各数据中心分配好ID,几乎不会变更。但各数据中心内部的 worker id 可能会因ID生成服务实例的动态创建销毁,而需要有一套动态的协调机制,以防同一数据中心内多个实例共用同一个 worker id。
本例就是利用 ZooKeeper 来协调分配 worker id。
源码:snowflake-worker-id-with-zk
关键类:IdGenCoordinator
此类用于协调分配 worker id。
基本原理
基本原理是 以创建 ZooKeeper 节点的方式来表示哪些 worker id 已被占用。
节点树结构示例:
- /example/id-gen/worker-ids 的子节点表示当前已被占用的 worker id。
其中各节点内容就是使用该 worker id 的id生成器实例的ip地址。 - /example/id-gen/gens 的子节点表示当前活跃的id生成生成器实例。
其中各节点内容就是相应生成器实例所使用的 worker id。
初始化步骤
- 1. 创建必要的 ZooKeeper 父节点。
“/example/id-gen/worker-ids” 和 “/example/id-gen/gens” 是必要的父节点。注意,需要处理 NodeExistsException,因为各 id 生成器实例启动时都会执行该操作。 - 2. 注册 ZooKeeper 连接状态变更事件处理器。
防止多个 id 生成器服务实例使用同一个 worker id。 - 3. 获取 worker id 并启动 id生成器服务
ZooKeeper 连接状态处理
- 当生成器与 ZooKeeper 断开连接时,需停止服务,以防多个生成器实例使用同一个 worker id;
- 当生成器与 ZooKeeper 重新连接时,需重新获取 worker id,因为原 worker id 可能已被其它实例占用。
获取 worker id 的关键逻辑
- 1. 尝试获取对应的 ZK 节点内容。
如 “/example/id-gen/gens/10.1.100.101”。
若成功获取,说明该服务实例已注册,节点内容就是已分配给它的 worker id;否则进行下一步:注册。 - 2. 从最小 worker id 开始,至最大 worker id,尝试创建相应的 ZK 节点。
若创建成功,则表示成功获得相应的 worker id。否则认定为失败。
需要创建两个节点,且必须在同一个ZooKeeper事务中完成。如,在一个事务中创建:
/example/id-gen/worker-ids/0 (节点内容为 10.1.100.101)
/example/id-gen/gens/10.1.100.101 (节点内容为 0)
相关推荐
分布式ID生成,主键生成,Java实现的snowflake算法
idworker-基于zookeeper,snowflake的分布式统一ID生成工具 是什么 idworker是一个基于zookeeper和snowflake算法的分布式统一ID生成工具,通过zookeeper自动注册机器(最多1024台),无需手动指定workerId和...
Twitter的分布式自增ID雪花算法snowflake (Java版)
Twitter的分布式自增ID算法snowflake (Java版)
迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
Vesta,uidgennator等分布式id生成方案 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境...
使用Zookeeper管理SnowFlake集群的workId 安装 下载并解压 进入解压目录并执行 ./SnowFlakeWithZK.jar start API GET http(s)://[host]:[port]/api/next/long 以长整型返回 GET http(s)://[host]:[port]/api/next/...
We have retired the initial release of Snowflake and working on open sourcing the next version based on Twitter-server, in a form that can run anywhere without requiring Twitter's own infrastructure ...
Twitter Snowflake算法,php版代码; 请见博客: http://blog.csdn.net/envon123/article/details/52953872
分布式ID生成,主键生成策略,snowflake算法,采用java实现。
**比如对于分微服务架构的系统中,服务间相互调用需要唯一标识,幂等处理,调用链路分析,日志追踪的时候都需要使用这个唯一标识,此时我们的系统就迫切的需要一个全局唯一的ID。 另外随着社会的发展,各种金融、...
分布式ID生成,雪花算法生成唯一ID工具类。...整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右
存在用完的风险。 引入旧数据时,可能会存在id重复,或id被重置的问题。 分库分表场景处理过于麻烦。 图形用户界面 GUID,最大唯一标识符,是一种有算法生成的二进制长度为128位的数字标识符,在理想情况下,任何...
优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 Python、Node.js、Ruby 多线程安全调用...
优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 Python、Node.js、Ruby 多线程安全调用...
主要介绍了Java实现Twitter的分布式自增ID算法snowflake,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
最近项目需要解决高并发分布式生成唯一ID值的问题,经过考虑,采用Snowflake算法,该算法是一个很有效的办法,具体的可以自己百度,这里是基于thinkPHP5 开发的通用的生成器,其实也是参考了网上的方法,只是增加了...
分布式系统,全局唯一ID,高效,永不重复。相比较uuid,雪花id是按照时间有序生成的,方便sql优化
Twitter 的 snowflake 在分布式生成唯一 UUID 应用还是蛮广泛的,基于 snowflake 的一些变种的算法网上也有不少。使用 snowflake 生成 UUID 很多都是在分布式场景下使用,我看了下网上有其中有几篇 PHP 实现的都没有...
nodejs-snowflake是一种快速可靠的方法,可以为分布式系统生成时间可排序的64位ID。 主要的ID生成功能是使用N-API用C ++编写的,这使得ID生成的过程非常快。 使用C ++进行id生成还可以确保生成的数字大小为64位。 ...