野谈系列之高性能可定制化分布式发号器

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

一、什么是分布式发号器

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

二、分布式发号器优势

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

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

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

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

5) 系统可任意扩展

三、分布式发号器架构图

四、分布式发号器流程图

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

2、concurrentValue不存在的流程图

3、concurrentValue存在的流程图

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

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台机器范围之内。

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

时间: 2024-10-07 15:40:29

野谈系列之高性能可定制化分布式发号器的相关文章

FAQ系列 | 用MySQL实现发号器

问题:用MySQL实现发号器功能,确保每次取到的ID号都是唯一的实现:下面是一个大致的思路,抛个砖,欢迎回帖.根据号段大小,决定是否分成多个表,每个表事先填充各个不同的号段.每个应用端取号时,设置事务隔离级别为:REPEATABLE READ,并且采用下面的方式读取数据 SELECT `ID` FROM `ID_RANGE_XX` ORDER BY ID LIMIT 1 FOR UPDATE 在上述情境中,只要选择某个ID号,那么其他终端也在读取该号时,会产生锁等待,而不会发生ID号被重用的情况

使用beanstalkd实现定制化持续集成过程中pipeline - 持续集成系列

持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中,最核心的一点就是,如何实现一个可定制化的任务流,即所谓的pipeline. 在传统的持续集成工具实现了pipeline功能,以供串联上下游job,并把多个job联系成一次完整的构建,例如jenkins的pipeline插件. 但是各种持续集成工具,或多或少都有自己的短板,总结起来如下: 1.配置并不

大数据平台一键安装OS【定制化OS镜像制作】

 定制化 大数据平台一键安装OS 大数据平台一键安装OS系列 大数据平台一键安装OS[搭建脚本篇] 定制化OS镜像制作 1.操作环境 操作环境:VMware Workstarion 9 and vSphere client 系统:CentOS -6.8-x86_64 工具:gconf-editor anaconda repodata createrepo mkisofs rsync 2.主要思路 定制化是通过kickstart脚本来实现的,linux系统安装完毕后在root目录下会生成anaco

PMC为超大规模部署提供高性价比定制化服务器硬件

PMC为超大规模部署提供高性价比定制化服务器硬件 PMC公司宣布率先推出16端口12Gb/s SAS及16端口 6Gb/s SATA I/O 控制器解决方案.PMC的数据中心IO控制器产品系列助力OEM和ODM,为超大规模部署提供高性价比的定制化服务器硬件,如OpenCompute.Windows 云服务器.Open Stack及天蝎计划等环境下的部署.此系列产品的端口密度为业界最高.功耗最低,且能提供逾1,000,000 次每秒输入/输出,因而能支持需求最为严苛的云计算应用软件. 此产品系列包

企业是否需要定制化ERP系统?

数据统计,大部分顾问认为在现代企业资源规划系统中已经找到了定制化功能了.于是,大量的用户想到了定制化所提供了一些功能和好处. 在这个追求个性化的时代下,人人都在追求不别一个不一样的东西:不能撞衫,不能撞包,甚至是不能撞脸,在这种大背景下企业ERP管理是否也在企求个性化,定制化呢?但与个人的追求相反,现今市场上供应商努力在创造一个可以适合所有行业,所有企业的解决方案.那么企业究竟是否需要一个定制化的解决方案? 数据统计,大部分顾问认为在现代企业资源规划系统中已经找到了定制化功能了.于是,大量的用户

U-Mail:如何实现EDM的个性化和定制化?

设想一下,一个上班族一天要接到多少垃圾邮件?据媒体报道,目前来往的邮件中,高达95%以上的是垃圾邮件,而且有些垃圾邮件还会故意占据着邮箱的最前列.同时,随着人们接受资讯越来越快捷便利,渠道越来越多,也一定程度上分流了注意力,导致打开邮箱的间隔期变长,对一封邮件的关注度下降.所以在邮件泛滥的情况下,U-Mail反复提倡邮件营销一定要做到个性化和定制化. 个性化的邮件通常能够迅速吸引起读者的注意力,在一堆邮件中突围而出.邮件的个性化包括从邮件标题到主题和内容乃至邮件的设计风格都进行了针对特定人群的改

AI应用开发实战 - 定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 零.定制化视觉服务简介 有的时候,在构建应用的过程中,在缺少强大计算资源与高性能算法的情况下,我们不一定需要自己从零开始训练模型.我们需要用的一些轮子,已经有人给我们造好了. 就比如: 微软提供的定制化视觉服务. 在机器学习应用中,任何情况下都需要一个或大或小的模型.而怎么得到这个模型是其中最复杂的部分.定制化视觉服务相当于在云端提供了一个生成模型的方法,把模型相关的复杂的算法都简化了.同时,它不仅能够让用户自己管理训练数据,定义自己的分类问题,而且支

关于客户定制化软件的探讨

我认为,软件开发,尤其是定制化的软件开发,一定要彻底弄清楚客户对软件的初衷.客户很多时候对软件没有什么确切的概念,会提出不合理的需求.你可以根据客户的初衷来分辨哪些功能是客户真正所需,哪些是客户的一厢情愿.如果是'真正所需',即使是再困难也应该实现,如果是'一厢情愿',应该尽量避免,多和客户沟通.因为这些'一厢情愿'会让软件走向错误的道路,开发人员会忘记哪些是重要的,哪些不重要,尤其是开发团队人员变动很大的时候,从而使软件走向歧途. 从4月开始,我们组接到了一个定制化的项目(c/s结构),大致的

OA系统信用盘新增三个极速彩版本定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 OA系统信用盘新增三个极速彩版    下载地址  QQ2952777280 OA系统信用盘新增三个极速彩版本程序源码参数说明: 运行环境:php5.2+mysql 源码类别:时时彩(彩票)现金网系统/两面盘 界面语言:繁体中文 源码授权:无加密文件及认证授权,永久性可直接使用. 版本支持:PC/WAP网页版 编程语言:PHP 零.定制化视觉服务简介 有的时候,在构建应用的过程中,在缺少强大计算资源与高性能算法的情况下,我们不一定需要自己从零开始训练模型