高性能可定制化分布式发号器-阿里云开发者社区

开发者社区> 行者武松> 正文

高性能可定制化分布式发号器

简介:
+关注继续查看
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

玄靖

刘兵,花名玄靖,目前供职于阿里巴巴,开源技术爱好者,高性能Redis中间件NRedis-Proxy作者,目前研究方向为java中间件,微服务等技术。


(一) 什么是分布式发号器

    说起分布式发号器的前生今世,咱们应该感恩这个时代;随着互联网在中国越来越普及化,单机系统或者一个小系统已经无法满足需要,随着用户逐渐增多,数据量越来越大,单个应用或者单个数据库已经无法满足需求,在应用以至于微服务来临,在数据库存储方面分库分表来临,可以解决问题;但是新的问题产生,怎么样做到多个应用可以有唯一主键或者序号,防止数据重复呢?分布式发号器正好为解决这个问题,可以让大家无须为这个问题烦恼了,这是本人写这篇文章初衷

(二) 分布式发号器优势

1) 解决分库分表中唯一序号的问题

2) 解决分布式应用或者微服务框架中唯一序号的问题

3) 提供可定制化生成规则,根据业务需求可自定义扩展

4) 性能高效且系统简单稳定

5) 系统可任意扩展

(三) 分布式发号器架构图

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

(四) 分布式发号器流程图

1) 分布式发号器重要字段


640?wx_fmt=png&wxfrom=5&wx_lazy=1


2) concurrentValue不存在的流程图


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

3) concurrentValue存在的流程图

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

(五) 目前存在分布式发号器解决方案

1) UUID

 Universally Unique IDentifier(UUID),有着正儿八经的RFC规范,是一个128bit的数字,也可以表现为32个16进制的字符(每个字符0-F的字符代表4bit),中间用"-"分割。

时间戳+UUID版本号: 分三段占16个字符(60bit+4bit)

Clock Sequence号与保留字段:占4个字符(13bit+3bit)

节点标识:占12个字符(48bit)

2) Hibernate

Hibernate的CustomVersionOneStrategy.java,解决了之前version 1的两个问题

时间戳(6bytes, 48bit):毫秒级别的,从1970年算起,能撑8925年....

顺序号(2bytes, 16bit, 最大值65535): 没有时间戳过了一毫秒要归零的事,各搞各的,short溢出到了负数就归0。

机器标识(4bytes 32bit): 拿localHost的IP地址,IPV4呢正好4个byte,但如果是IPV6要16个bytes,就只拿前4个byte。

进程标识(4bytes 32bit): 用当前时间戳右移8位再取整数应付,不信两条线程会同时启动。

3) MongoDB

  MongoDB的ObjectId.java

时间戳(4 bytes 32bit):是秒级别的,从1970年算起,能撑136年。

自增序列(3bytes 24bit, 最大值一千六百万): 是一个从随机数开始(机智)的Int不断加一,也没有时间戳过了一秒要归零的事,各搞各的。因为只有3bytes,所以一个4bytes的Int还要截一下后3bytes。

机器标识(3bytes 24bit): 将所有网卡的Mac地址拼在一起做个HashCode,同样一个int还要截一下后3bytes。搞不到网卡就用随机数混过去。

进程标识(2bytes 16bits):从JMX里搞回来到进程号,搞不到就用进程名的hash或者随机数混过去。

可见,MongoDB的每一个字段设计都比Hibernate的更合理一点,时间戳是秒级别的,自增序列变长了,进程标识变短了。总长度也降到了12 bytes 96bit。

4) Twitter的snowflake派号器

  snowflake也是一个派号器,基于Thrift的服务,不过不是用redis简单自增,而是类似UUID version1,

只有一个Long 64bit的长度,所以IdWorker紧巴巴的分配成:

时间戳(42bit) :自从2012年以来(比那些从1970年算起的会过日子)的毫秒数,能撑139年。

自增序列(12bit,最大值4096):毫秒之内的自增,过了一毫秒会重新置0。

DataCenter ID (5 bit, 最大值32):配置值,支持多机房。

Worker ID ( 5 bit, 最大值32),配置值,因为是派号器的id,一个机房里最多32个派号器就够了,还会在ZK里做下注册。

        可见,因为是中央派号器,把至少40bit的节点标识都省出来了,换成10bit的派号器标识。所以整个UID能够只用一个Long表达。

  另外,这种派号器,client每次只能一个ID,不能批量取,所以额外增加的延时是问题,而且只能1024台机器范围之内。

  以上几种方案同一个问题,不可自定义,位数过长


来源:中生代技术

原文链接


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
因云而生 阿里云发布云服务器操作系统Alinux3:性能最高提升40%
阿里云正式推出第三代云服务器操作系统Alibaba Cloud Linux 3(以下简称Alinux3),基于“因云而生”的云原生技术理念,Alinux3进一步提升了云上客户的安全性、稳定性和运行时性能,并深度融合自研软件生态,全面兼容 RHEL/CentOS 8生态,优化后主流应用性能提升10%~40%;同时提供长达8年的免费软件维护和技术支持,保障开发者最佳云上操作体验。
3444 0
17、Python快速开发分布式搜索引擎Scrapy精讲—深度优先与广度优先原理
【http://www.lqkweb.com】 【http://www.swpan.cn】 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认是深度优先的 广度优先 是以层级来执行的,(列队方式实现) 【转载自:http://www.
657 0
Alibaba Cloud Linux 2 LTS 正式发布,提供更高性能和更多保障!
在Alibaba Cloud Linux 2(原Aliyun Linux 2)上线一年之际阿里云对外正式发布Alibaba Cloud Linux 2 LTS版本。LTS版本的发布对于Alibaba Cloud Linux 2来说是一个重要的里程碑,标志阿里云将为Alibaba Cloud Linux 2提供长期支持、稳定的更新、更好的服务,为Alibaba Cloud Linux 2的客户提供更多保障。
712 0
阿里云 Node.js 性能平台(公测/商业化)发布
产品介绍: ["Node.js 性能平台(Node.js Performace Platform),是由阿里云所提供的,面向中大型 Node.js 应用提供 性能监控、安全提醒、故障排查、性能优化 等服务的整体性解决方案。
1149 0
阿里云弹性高性能计算产品商业化正式发布
来自全国500多家企业申请试用,结合客户的体验需求和反馈意见,不断地改善和打磨,弹性高性能计算商业版有了很大的优化,在产品性能和体验上都有全新的升级。
3452 0
+关注
行者武松
杀人者,打虎武松也。
17142
文章
2569
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载