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实现(上) - 实现原理的更多相关文章

  1. 分布式ID生成器PHP+Swoole实现(下) - 代码实现

    上篇文章主要介绍<实现原理>,这篇看主要代码的编写. 实现IDGenerator类 64位ID由以下元素组成:固定位占2位,时间戳占41位,服务实例数字编号占4位,业务编号占10位,自增i ...

  2. go语言实现分布式id生成器

    本文:https://chai2010.cn/advanced-go-programming-book/ch6-cloud/ch6-01-dist-id.html 分布式id生成器 有时我们需要能够生 ...

  3. 分布式ID生成器的解决方案总结

    在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要 ...

  4. 来吧,自己动手撸一个分布式ID生成器组件

    在经过了众多轮的面试之后,小林终于进入到了一家互联网公司的基础架构组,小林目前在公司有使用到架构组研究到分布式id生成器,前一阵子大概看了下其内部的实现,发现还是存在一些架构设计不合理之处.但是又由于 ...

  5. CosId 通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...

  6. CosId 1.0.0 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...

  7. CosId 1.0.3 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...

  8. CosId 1.1.0 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...

  9. CosId 1.1.8 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式 ID 生成器. 目前提供了三类 ID 生成器: SnowflakeId : 单机 TPS 性 ...

随机推荐

  1. CTF web题型解题技巧

    工具集 基础工具:Burpsuite,python,firefox(hackbar,foxyproxy,user-agent,swither等) 扫描工具:nmap,nessus,openvas sq ...

  2. 使用textarea标签代替input标签可以实现输入框的大小调节,自动换行,滚动条显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. C语言 一些算法

    1,斐波那契数列 ①递归 时间复杂度O(2^n)#include <stdio.h> int fib(int n){ ||n==) ; ) + fib(n-); } int main(){ ...

  4. php扩展编译流程路

  5. ElasticSearch.net NEST批量创建修改删除索引完整示例

    本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改 ...

  6. [javascript]—jQuery解析本地 XML 文档

    Create a jQuery object using an XML string and obtain the value of the title node. <!doctype html ...

  7. 处理序列的几个小技巧:保持原序去重,命名切片以及Counter类

    一. 去重并保持原来元素的顺序 def dedupe(items): h = [] for item in items: if item not in h: h.append(item) return ...

  8. 零基础学习Python数据分析

    网上虽然有很多Python学习的教程,但是大多是围绕Python网页开发等展开.数据分析所需要的Python技能和网页开发等差别非常大,本人就是浪费了很多时间来看这些博客.书籍.所以就有了本文,希望能 ...

  9. day00 -----博客作业1

    问题1.使用while循环输入 1 2 3 4 5 6     8 9 10 i = 0 while i<10: i+=1 if i ==7: continue print(i) 问题2 求1- ...

  10. 【bug】记一个有趣的“bug”

    产品经理在使用我们用户功能的是,需要查询一个用户,知道这个用户的id,我说支持模糊查询的. 他输入"余XX",点击查询,怎么都查不出这个用户. 我到用户表里确认,确实有这个ID的用 ...