文档章节

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

liubingsmile
 liubingsmile
发布于 2017/04/05 12:53
字数 1219
阅读 3817
收藏 162
点赞 1
评论 19

一 什么是分布式发号器

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

二  分布式发号器优势

  1. 解决分库分表中唯一序号的问题
  2. 解决分布式应用或者微服务框架中唯一序号的问题
  3. 提供可定制化生成规则,根据业务需求可自定义扩展
  4. 性能高效且系统简单稳定
  5. 系统可任意扩展

三 分布式发号器架构图

    

四 分布式发号器流程图

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

序号 字段名称 字段类型 描述
concurrentValue 当前值 Integer 当前最新值
step 步长 Integer 每个应用步长不一样, 防止生成重复
maxValue 最大值 Integer 每个应用的最大值
defExpession 自定义表达式 String 自定义生成规则表达式

    2) concurrentValue不存在的流程图

     

    3) concurrentValue存在的流程图

      

 

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

1) UUID

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

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

 

六) 推荐大神开涛书籍(京东有卖,绝对干货满满,买书送知识)

© 著作权归作者所有

共有 人打赏支持
liubingsmile

liubingsmile

粉丝 114
博文 5
码字总数 6238
作品 7
朝阳
高级程序员
加载中

评论(19)

oreak
oreak
还得依赖redis,不好
繁华似水
繁华似水
不同机器生产的id可以比较大小么??
liubingsmile
liubingsmile

引用来自“loki_lan”的评论

服务本身生成UUID跟分布式发号器生成UUID不是一样吗,前者可以保证不重复,是不是就不需要发号器了呢?
两者方式不一样
liubingsmile
liubingsmile

引用来自“吴建南”的评论

concurrentValue....并发值?
最新值,最近值
吴建南
吴建南
concurrentValue....并发值?
liubingsmile
liubingsmile

引用来自“loki_lan”的评论

服务本身生成UUID跟分布式发号器生成UUID不是一样吗,前者可以保证不重复,是不是就不需要发号器了呢?
先看懂规则,不一样的
loki_lan
loki_lan
服务本身生成UUID跟分布式发号器生成UUID不是一样吗,前者可以保证不重复,是不是就不需要发号器了呢?
天豪-Jason
天豪-Jason
有点深奥,对于我这个小白来说
liubingsmile
liubingsmile

引用来自“刘利民”的评论

不开源吗,让大家也学习一下
源码不开源,不好意思
liubingsmile
liubingsmile

引用来自“刘大神”的评论

引用来自“liubingsmile”的评论

引用来自“刘大神”的评论

引用来自“liubingsmile”的评论

引用来自“刘大神”的评论

引用来自“liubingsmile”的评论

引用来自“刘大神”的评论

这个分布式发号器就只是解决分布式数据库键值重复的问题么?

回复@刘大神 : 不只是,比如券码,提货码等

回复@liubingsmile : 哦哦,那你的键值生成是一种什么样子的策略呢?

回复@刘大神 : 可以自定义配置

回复@liubingsmile : 举个栗子
比如生成规则,需要根据不同的系统生成不一样的规则

回复@liubingsmile : 那如果这个系统同时用到N个系统的时候,生成规则不会出现一丢丢的冲突的可能么?其实,我想知道你具体生成规则是怎么样子的,比如说我现在用的,对本地时间做一些简单的位移运算,这样时间是唯一的,就不会出现重复的情况
你要考虑分布式应用
架构书籍推荐:Java中高级、架构师值得一读!

上周我们免费送出了6本关于Python的重量级技术书籍,推出后反响特别强烈,有一个和最后一名仅差了一个赞,不过我们还是额外加送了一本送给这位朋友,以资鼓励,从另一面也可以看出Java程序猿...

Java技术栈
04/14
0
0
分布式任务执行系统--Gleam-Go

Gleam 是一个高性能和高效的分布式执行系统。纯 Go 编写,可独立运行,也可分布式运行。 高性能 纯 Go 编写的 mapper 和 reducer 具有高性能和并发性 LuaJIT 的性能,可与 C,Java,Go 相媲美...

匿名
2017/03/13
315
0
coconut 更新至 0.0.7.1,应用缓存服务器

coconut 0.0.7.1 发布了。 fasterhttp更新至1.3.0 tcpdaemon更新至1.3.0:支持CPU亲缘性 支持设置IP 优化性能:已连接会话预分配内存 coconut是一款应用缓存服务器,主要用于场景化的缓存服务...

calvinwilliams
2017/06/19
304
0
Netty高性能架构的理解之道

Netty的简单介绍 Netty 是一个 NIO client-server(客户端服务器)框架,使用 Netty 可以快速开发网络应用,例如服务器和客户 端协议。 Netty 提供了一种新的方式来使开发网络应用程序,这种新...

烂猪皮
05/04
0
0
高性能分布式数据存储--MORPHiS

MORPHiS 现在是早期阶段,主要目标是成为一个全局加密分布式存储,为了替代云存储。MORPHiS 现在包含一个 DMAIL(分布式邮件),内置垃圾邮件拦截,内置加密,免费发送信息。 MORPHiS 的使用...

叶秀兰
2015/08/05
3.1K
1
Cocos与本体达成战略合作,共同打造游戏领域的分布式信任生态

Cocos与本体达成战略合作,共同打造游戏领域的分布式信任生态 2018-07-12 10:51编辑: garace分类:区块链来源:Cocos-BCX 触控科技CocosCocos-BCX 招聘信息: iOS开发 iOS开发 iOS开发 app开...

garace
07/12
0
0
李艳鹏/vesta-id-generator

Vesta Vesta是一款通用的ID产生器,互联网俗称统一发号器,它具有全局唯一、粗略有序、可反解和可制造等特性,它支持三种发布模式:嵌入发布模式、中心服务器发布模式、REST发布模式,根据业...

李艳鹏
04/13
0
0
MapReduce&&Hadoop

高能性能计算(High Performance Computing, HPC)和网格计算(Grid Computing)组织多年以来一直在研究大规模数据处理,主要使用类似于消息传递接口(Message Passing Interface, MPI)的API。从广...

卿卿的博文
2017/12/16
0
0
应用缓存服务器--coconut

概述 coconut是一款应用缓存服务器,主要用于场景化的缓存服务。 coconut目前提供了两种场景模式:全局序列号发生器、全局额度管理器,可成为分布式、集群化系统架构中高性能独立功能部件。 ...

calvinwilliams
2017/06/12
233
0
有经验JAVA程序员如何提升自己?

具有一到五年开发经验 需要学习内容很多 JVM/分布式/高并发/性能优化/Spring MVC/Spring Boot/Spring Cloud/MyBatis/Netty源码分析等等等 01、透彻理解Tomcat原理手写动静态资源的实现 02、分...

阿阳啊啊
2017/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部