From a1c77a1e3206197a50097dd710433b35ee246ec4 Mon Sep 17 00:00:00 2001 From: wangkang Date: Sat, 9 Sep 2017 14:13:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=9A=E5=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- doc/架构设计.vsd | Bin 386560 -> 389632 bytes md/16.md | 201 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 md/16.md diff --git a/README.md b/README.md index 30eb2c6..cfd1c0d 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ## 分布式ID-逻辑架构示意 -![分布式ID-逻辑架构示意](https://static.oschina.net/uploads/img/201709/09110632_8gYc.png "分布式ID-逻辑架构示意") +![分布式ID-逻辑架构示意](https://static.oschina.net/uploads/img/201709/09134644_PINI.png "分布式ID-逻辑架构示意") ## 分布式ID-发号流程示意 @@ -32,6 +32,8 @@ ## 项目博客 (点击跳转) +- [spring boot / cloud (十六) 分布式ID生成服务 ](https://my.oschina.net/wangkang80/blog/1532272) + - [spring boot / cloud (十五) 分布式调度中心进阶](https://my.oschina.net/wangkang80/blog/1525908) - [spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法](https://my.oschina.net/wangkang80/blog/1524746) diff --git a/doc/架构设计.vsd b/doc/架构设计.vsd index 397c344900aa8222465cdf6e82f87f9442926169..5965d561fe440a6bee0063d8e7539f471d129672 100644 GIT binary patch delta 43201 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 delta 40029 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 diff --git a/md/16.md b/md/16.md new file mode 100644 index 0000000..2fe8bad --- /dev/null +++ b/md/16.md @@ -0,0 +1,201 @@ +# spring boot / cloud (十六) 分布式ID生成服务 + +在几乎所有的**分布式系统**或者采用了**分库/分表设计的系统**中,几乎都会需要**生成数据的唯一标识ID**的需求, + +常规做法,是使用数据库中的自动增长列来做系统主键,但是这样的做法无法保证ID全局唯一. + +那么一个分布式ID生成器应该满足那些需求呢 : + +- **全局唯一性** + +- **趋势递增** + +- **能够融入分库基因** + +本文将基于snowflake的算法来进行以下的讨论,当然,分布式ID的生成方案有很多, + +不过在本文并不会分散开来讨论/比对,因为网上相关的文章实在太多,如果有需要了解的同学,请自行百度. + +同时,也不会讨论snowflake算法,同样也是因为网上相关的文章实在太多,如果有需要了解的同学,请自行百度. + +## **本文期望解决什么问题?** + +先看两段代码: + +``` java +public void id() { + Map map = new HashMap<>(); + int maxCount = 100; + IdWorker idWorker = new IdWorker(1, 1); + for (int i = 0; i < maxCount; i++) { + long id = idWorker.nextId(); + map.put(id, id); + } + log.info("{} , {}", maxCount, map.size()); + } +``` + +输出为 : 100 , 100 + +``` java +public void id() { + Map map = new HashMap<>(); + int maxCount = 100; + for (int i = 0; i < maxCount; i++) { + IdWorker idWorker = new IdWorker(1, 1); + long id = idWorker.nextId(); + map.put(id, id); + } + log.info("{} , {}", maxCount, map.size()); + } +``` + +输出为 : 100 , 10 + +### 这两段代码的区别,相信大家一眼就能看出,但是那为什么会出现这样的情况呢? + +了解snowflake的同学也都知道,这个算法是基于时间的,如下组成 : + +**0 | 时间(41位) | 数据中心ID(5位) | 机器ID(5位) | 序号(12位)** + +而生成ID的算法逻辑,简单点说,在相同**数据中心ID**和**机器ID**的情况下,如果时间的毫秒数是一致的,那么就通过递增序列号来保证ID不重复. + +也就是说在**1毫秒**内最大生成的ID个数是**二进制12bit的最大值**,也就是**4096**(**0-4095**)个 + +那么如果序列号超过了这个最大值,则会将程序阻塞到下一毫秒,然后序列号归零,继续生成ID. + +好知道了生成ID的逻辑后,上面两个程序判断的现象也就不难解释了. + +**程序一** : 没有重复,是因为在整个循环中,ID生成器只实例化过一次,在循环的过程中,能正常的递增序列号,所以不会有重复的ID出现 + +**程序二** : 有重复,是因为ID生成器是在循环中循环实例化的,每次生成ID的时候序列号都是0,但是程序执行很快,得到的时间毫秒数又是一样的,那么,就必然会有重复值了. + +**所以从以上的程序片段和分析中可以得出一个结论 : 要想snowflake生成全局唯一的ID,那么ID生成器必须也是全局单例的** + +### 那申明一个全局静态的ID生成器不就行了? + +两个点要主注意一下 : + +- **分布式系统下全局静态变量也是多份的,因为系统可能运行在不同的JVM下,并不能保证变量的全局单例** + +- **前面提到了在同一毫秒下,最多只能生成4096个ID,对于那些并发量很大是系统来说,显然是不够的, +那么这个时候就是通过datacenterId和workerId来做区分,这两个ID,分别是5bit,共10bit,最大值是1024(0-1023)个, +在这种情况下,snowflake一毫秒理论上最大能够生成的ID数量是约42W个,这是一个非常大的基数了,理论上能够满足绝大多数系统的并发量** + +**所以得出一个结论 : snowflake可以通过datacenterId和workerId来区分ID的归属(可以是业务线,可以是机房,等等,按需定义)来达到更大的ID生成数量** + +### 那么有那些方法来分配atacenterId和workerId呢? + +- **写死 : 正如上面说的一样,单机部署,然后写死两个值** + +- **读配置文件 : 将值放在配置中心,应用启动的时候读取,然后初始化** + +- **动态分配 : 本文主旨** + +## **所以本文主要讨论的是如何动态分配snowflake的datacenterId和workerId,以及如何做到高可用** + +所以大家先看一下架构图 : + +## 分布式ID-逻辑架构示意 + +![分布式ID-逻辑架构示意](https://static.oschina.net/uploads/img/201709/09134644_PINI.png "分布式ID-逻辑架构示意") + +## 分布式ID-发号流程示意 + +![分布式ID-发号流程示意](https://static.oschina.net/uploads/img/201709/09110610_Aum3.png "分布式ID-发号流程示意") + +## 相关源码可在本文末尾的配套代码仓库中获得,工程是 : udf-starter-id + +## 架构设计 + +### 构建独立的ID生成服务,提供如下服务: + +``` java +#生成分布式ID(按时间戳区分datacenterId和workerId) +/service/id + +#生成分布式ID(按dwId[0-1023]) +/service/id/{dwId} + +#生成分布式ID(按datacenterId[0-31]和workerId[0-31]) +/service/id/{datacenterId}/{workerId} + +#批量生成分布式ID(按时间戳区分datacenterId和workerId) +/service/id/batch/{count} + +#批量生成分布式ID(按dwId[0-1023]) +/service/id/batch/{dwId}/{count} + +#批量生成分布式ID(按datacenterId[0-31]和workerId[0-31]) +/service/id/batch/{datacenterId}/{workerId}/{count} +``` + +### 融入分库基因 + +在提供出来的rest服务中,提供了datacenterId和workerId的参数(dwId就是两者的融合,10bit), + +总共预留了10个bit的空余来支持分库分表,最大支持1024个节点. + +#### 反解析分布式ID + +snowflake生成的ID是可以被反解析的,这样更进一步的支持了分库的相关炒作,相关实现如下 : + +``` java + Id reverseId = new Id(); +reverseId.setSequence((id) & ~(-1L << 12)); // sequence +reverseId.setDwId((id >> (12)) & ~(-1L << (10))); // dwId +reverseId.setWorkerId((id >> 12) & ~(-1L << 5)); // workerId +reverseId.setDatacenterId((id >> 17) & ~(-1L << 5)); // datacenterId +reverseId.setTimestamp((id >> 22) + TWEPOCH); // timestamp +return reverseId; +``` + +### 集群部署 和 懒实例化ID生成器 + +本方案是可以支持ID生成服务有多个实例,最多1024个,能并且能保证每个实例内,相同datacenterId和workerId的ID生成器只有一个,做到全局单例. + +主要是通过redis原子锁的来实现的.详情可看上面的流程图,主要分为**本地ID生成**和**跨实例ID生成**两种模式 : + +#### **本地生成** + +这种情况比较简单,就是生成ID的请求刚刚落到ID生成器所在的实例上,然后就可以直接拿到ID生成器,然后生成ID. + +#### **跨实例ID生成** + +这种情况简单点说就是,比如你要生成**3-3**的ID,这个ID生成器在**实例A**上,但是负载均衡器将请求发到**实例B**上去了, + +这个时候**实例B**上并没有对应的ID生成器,这个时候,就会从缓存中拿到对应的缓存值,拿到用用这个ID生成器的HOST和PORT, + +然后在做一个RMS请求,调用远程的rest服务,生成ID,然后返回 + +### 高可用 和 故障转移 + +**上面提到了,ID生成器现在是全网单例的了,那么其中一个节点有故障,挂掉了怎么办呢?** + +在**跨实例ID生成**的场景下,会有RMS请求失败的情况,远程节点有可能会故障,这个时候,一旦RMS请求失败,则会触发**故障转移**, + +具体操作就是将redis中的对应缓存删除掉,然后走一个实例化ID生成器的流程,这个时候,**当前处理请求的节点**就会将**故障节点**拥有的ID生成器转移过来,转为**本地生成**模式,从而做到的**故障转移** + +### 性能 + +如果是**本地ID生成**的话,那基本没有性能损耗,直接操作本地变量. + +**跨实例ID生成**的情况会多出来一个RMS请求的耗时,但是一次ID生成的请求最多触发一次RMS请求,消耗是可控的 + +在有**节点故障**的时候,**触发故障转移**会额外的产生一次**ID实例化的流程**,会造成**轻微波动**,但紧当前的这一次请求,下次的请求就会转为**本地ID生成的模式** + +## **结束** + +今天跟大家分享了如何动态分配snowflake的datacenterId和workerId,以及如何做到高可用的设计和思路,环境大家提出意见和建议 + +## **代码仓库** (博客配套代码) + +- [udf-starter : 基础项目,脚手架,框架](https://gitee.com/wangkang/udf) + +- [udf-sample : 集成样例](https://gitee.com/wangkang/udf-sample) + +--------- + +想获得最快更新,请关注公众号 + +![想获得最快更新,请关注公众号](https://static.oschina.net/uploads/img/201705/24155414_Pukg.jpg "想获得最快更新,请关注公众号") \ No newline at end of file