文档章节

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

liubingsmile
 liubingsmile
发布于 2017/04/05 12:53
字数 1219
阅读 4.6K
收藏 162

精选30+云产品,助力企业轻松上云!>>>

一 什么是分布式发号器

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

二  分布式发号器优势

  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

粉丝 117
博文 4
码字总数 6229
作品 7
朝阳
高级程序员
私信 提问
加载中
此博客有 19 条评论,请先登录后再查看。
如何设计一款“高可用高性能”的发号器?

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 背景 在分布式场景中,很多地方需要生成全局唯一的id,如数据库分库分表后需要用唯...

osc_boe54hqe
05/21
12
0
如何设计一款“高可用高性能”的发号器?

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 背景 在分布式场景中,很多地方需要生成全局唯一的id,如数据库分库分表后需要用唯...

云栖号资讯小哥
05/20
0
0
基于微服务架构的商城 - mallcloud-platform

mallcloud商城基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba,并采用前后端分离的企业级微服务敏捷开发架构。 前后端分离的企业级微服务架构 基于、和 深度定制真正实现了基于、和的无...

沈浩z
2019/09/29
5.9K
0
微服务框架开源项目

一、项目地址 https://gitee.com/zlt2000/microservices-platform 二、项目介绍 基于、和 采用前后端分离的企业级微服务多租户系统架构 主要针对解决微服务和业务开发时常见的 深度定制真正实...

陶陶技术笔记
2019/09/10
0
0
倒计时1天!你离Gdevops收官盛会只缺一份精华指引

还有最后一天! 11月30日,一场浓缩全年技术精华的盛会—— 2018 Gdevops全球敏捷运维峰会-广州站 重!磅!开!启! 为了让大家能够满载而归,不错过每一分精彩,参会指南这就安排献上~流程解...

全力以赴的
2018/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【题解】p6160 [Cnoi2020]向量

原题传送门 序 啊又是勤奋学习的一天...... 这种mo题目能做出来纯靠感觉。 样例分析 样例输入给了组3、4、5的勾股数,而输出正好是三向量加和为0时的答案。 嗯我好像感觉到了什么...... 于是...

osc_4dady4pk
45分钟前
13
0
【题解】p6160 [Cnoi2020]向量

原题传送门 序 啊又是勤奋学习的一天...... 这种mo题目能做出来纯靠感觉。 样例分析 样例输入给了组3、4、5的勾股数,而输出正好是三向量加和为0时的答案。 嗯我好像感觉到了什么...... 于是...

osc_a7a1prn6
47分钟前
13
0
FreeSql (一)入门

FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支持 NetStandard 所有运行平台。(QQ群:4336577) 模型 FreeSql 使用模型执行数据访问,模...

osc_smzoc82r
48分钟前
18
0
TCP协议粘包问题详解

TCP协议粘包问题详解 前言   在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产...

osc_tjnx25e9
50分钟前
29
0
Ubuntu16.04密码正确 进不去桌面系统(已测试恢复正常)

遇到过两次ubuntu输入密码正确,但是进不去系统,输入密码后,跳转到一下界面 之后又返回到登陆界面,一直这样循环输入密码。 Guest用户可以。 解决办法:   1。进入tty下 :ctrl+alt+F1(F...

osc_lfbryx1h
51分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部