分布式ID生成器PHP+Swoole实现(上) - 实现原理
1.发号器介绍
什么是发号器?
全局唯一ID生成器,主要用于分库分表唯一ID,分布式系统数据的唯一标识。
是否需要发号器?
1)是否需要全局唯一。
分布式系统应该不受单点递增ID限制,中心式的会涉及到锁的问题,而锁意味着成本和性能的下降。
2)时间相关。
时间是天然唯一递增的,不过每秒或每毫秒生成一个唯一ID明显不够,这时候就需要引入SequenceID,使得发号器能在秒或毫秒时间内继续递增,如果引入服务器实例编号、业务编号,多维依赖能使ID值在同一秒或毫秒内生成的更多。
如果要做到精确有序,需要对SequenceID进行并发控制,性能上肯定会打折。所以在秒或毫秒级别上不再保证顺序是系统应该要考虑是否能接受的地方。
3)可反解,解开的是什么?
ID反解能得到这条信息是什么时候生成的,由什么业务生成的,在哪台服务器上生成,这相当于身份证,身份证就是一个典型的分布式ID生成器。比如:

4)可制造(伪造一个过去的一条业务记录)。
比如在存储失败时,可能需要临时导出请求供后续处理,而后续处理时已经离开了当时的时间点,顺序跟其他系统错开了。我们需要制造出这样的ID 以便系统好像一直正常运行一样,可制造的 ID让你可以控制生产日期。为什么不用UUID?字符串型查询效率低;无序;太长了...
2.业界已知的ID设计
1)SnowFlake
推特的分布式自增ID算法。41bit留给毫秒时间,10bit给MachineID,也就是机器要预先配置,剩下12位留给Sequence。

这里的时间戳保存的是当前时间与固定过去时间得一个差值,不是当前时间。这样的好处是能使用更长时间,而且不受年份限制,只取决于从什么时候开始用的,2^41 / 1000360024*365=69年。
如果保存的是当前时间戳,最多只能使用到2039年。2^41=2199023255552=2039/9/7 23:47:35
理论上单机速度:2^12*1000 = 4 096 000/s
2)微博
微博使用了秒级的时间,用了30bit,Sequence 用了15位,理论上可以搞定2^15=3.2w/s的速度。
用4bit来区分IDC,也就是可以支持16个 IDC。剩下的有2bit 用来区分业务,由于当前发号服务是机房中心式的,1bit 来区分热备。30+15+4+2+1=52
服务端使用memcache协议。
3.设计细节
2+41+4+10+7 = 64

- 固定位01, 0表示符号位,1统一长度19位
- 4位服务器编号可支持开启16个集群实例
- 10位业务编号支持1024个业务分类
- 理论上单机速度2^7*1000 = 128 000/s
运行流程图

为什么要用到swoole?
- 1)使用Redis传输协议,作为内部数据交互比http更高效。
- 2)swoole_table共享内存变量,解决多进程间的数据共享和同步问题。
- 3)swoole_atomic多进程间的数据同步加锁。
分布式ID生成器PHP+Swoole实现(上) - 实现原理的更多相关文章
- 分布式ID生成器PHP+Swoole实现(下) - 代码实现
上篇文章主要介绍<实现原理>,这篇看主要代码的编写. 实现IDGenerator类 64位ID由以下元素组成:固定位占2位,时间戳占41位,服务实例数字编号占4位,业务编号占10位,自增i ...
- go语言实现分布式id生成器
本文:https://chai2010.cn/advanced-go-programming-book/ch6-cloud/ch6-01-dist-id.html 分布式id生成器 有时我们需要能够生 ...
- 分布式ID生成器的解决方案总结
在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要 ...
- 来吧,自己动手撸一个分布式ID生成器组件
在经过了众多轮的面试之后,小林终于进入到了一家互联网公司的基础架构组,小林目前在公司有使用到架构组研究到分布式id生成器,前一阵子大概看了下其内部的实现,发现还是存在一些架构设计不合理之处.但是又由于 ...
- CosId 通用、灵活、高性能的分布式 ID 生成器
CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...
- CosId 1.0.0 发布,通用、灵活、高性能的分布式 ID 生成器
CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...
- CosId 1.0.3 发布,通用、灵活、高性能的分布式 ID 生成器
CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...
- CosId 1.1.0 发布,通用、灵活、高性能的分布式 ID 生成器
CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...
- CosId 1.1.8 发布,通用、灵活、高性能的分布式 ID 生成器
CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式 ID 生成器. 目前提供了三类 ID 生成器: SnowflakeId : 单机 TPS 性 ...
随机推荐
- Java笔记(一)GC及类加载
垃圾回收器(GC) 垃圾回收器:java中有一个线程,专门负责JVM中垃圾内存的释放 垃圾:没有引用的内存节点 垃圾回收的算法 注意:垃圾回收有自己的算法,我们是不能控制垃圾回 ...
- LWIP
LWIP 今天要谈的不是LWIP协议栈的内容,只是简单谈谈关于STM32F407快速使用LWIP做网络通讯的一些经历. 我是一个网络小白,对网络知识一窍不通,仅仅是知道有IP地址.网关这玩意,也从来没 ...
- kvm快照备份及常用命令
转载自:http://www.myjishu.com/?p=431 好文章 kvm快照备份及常用命令 kvm快照,分两种: 1种lvm快照,如果分区是lvm,可以利用lvm进行kvm的快照备份 2种由 ...
- (四)SSO之CAS框架单点登录,自定义验证登录方式
应需求的变化,在登录cas的时候,默认根据用户名和密码进行验证,如果加上用户名,密码和一个系统标识进行验证呢?该如何做呢? 我们知道cas默认的登录界面中,输入的用户名和密码,再配置一下deploye ...
- 总结day6 ---- set集合,基本类型的相互转化,编码,数据类型总结,循环时候不要动列表或者字典,深浅copy
python小数据池,代码块的最详细.深入剖析 一. id is == 二. 代码块 三. 小数据池 四. 总结 一,id,is,== 在Python中,id是什么?id是内存地址,比如你利用id ...
- 计算机网络课设之TCP通讯录
这篇文章我主要是想对这学期末计算机网络课程设计所做的一个小项目也就是基于tcp协议的通讯录做一个总结梳理.项目的具体的代码实现是基于C语言,当然在此之前网上也有一些基于c++编写的tcp通讯录,原理都 ...
- Linux和Windows数据同步
正在做一个小项目,关于Linux和Windows数据同步,新知识很兴奋,比赛很有信心,加油吧少年 项目进行中:今晚实验室包宿开整.
- Java switch函数
switch()函数中能放置的值为:byte,short,char,int,string,enum类型或者byte,short,char,int的包装类,其中,string类型是java7(含)之后才 ...
- Django分页类的封装
Django分页类的封装 Django ORM 封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...
- [转] Spark sql 内置配置(V2.2)
[From] https://blog.csdn.net/u010990043/article/details/82842995 最近整理了一下spark SQL内置配.加粗配置项是对sparkSQL ...