热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分布式ID生成器PHP+Swoole实现(上)实现原理

1.发号器介绍什么是发号器?全局唯一ID生成器,主要用于分库分表唯一ID,分布式系统数据的唯一标识。是否需要发号器?1)是否需要全局唯一。分布式系统应该不受单点递增ID限
全局唯一ID生成器,主要用于分库分表唯一ID,分布式系统数据的唯一标识。

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多进程间的数据同步加锁。


推荐阅读
  • php怎么做rpc通信(RPC通信)
    导读:很多朋友问到关于php怎么做rpc通信的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • PHP5.5在Windows下安装memcached的方法下载服务端资源
    本文介绍了在Windows下安装PHP5.5的memcached的方法,包括下载服务端资源、解压、注册、卸载、启动和停止等步骤,并提供了相关的学习推荐。同时还提供了下载PHP在Windows下的php_memcache.dll文件的链接。 ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • php yac缓存如何清理,yac和memcache性能对比测试
    yac是Laruence开发的一个php进程共享内存的开源项目。详情可以查看。http:www.laruence.com201303182846.htmlmemcache就不用多说 ... [详细]
  • http:simple-is-better.comnews1047Firefly是免费、开源、稳定、快速扩展、能“热更新”的分布式游戏服务器端框架,采用Python编 ... [详细]
  • PHP语言之所以能有今天的地位,得益于PHP语言设计者一直遵从实用主义,将技术的复杂性隐藏在底层。PHP语言入门简单,容易掌握,程序健壮性好。 ... [详细]
  • 哪里有php培训(php培训哪家好)
    导读:今天编程笔记来给各位分享关于哪里有php培训的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: ... [详细]
  • 电商系统设计艺术——秒杀业务设计
    一、秒杀场景人多货少,只有少量的人能够抢购成功。高并发,秒杀业务在开始之前流量比较平稳,开始后流量会直线性的上升。持续时间短࿰ ... [详细]
  • redis 获取不到_redis 缓存锁的实现方法
    1.redis加锁分类redis能用的的加锁命令分表是INCR、SETNX、SET2.第一种锁命令INCR这种加锁的思路是,key不存在,那么key的值 ... [详细]
  • nosql数据库的基本要求Nosql全称是NotOnlySQL,是一种不同于关系型数据库的数据库管理系统设计方式。对NoSQL最普遍的解释是“非关系型的”,强调Key-ValueS ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 高可用架构_MySQL高可用架构设计
    文章来自于https:www.jianshu.compd3107bda2963PHP进阶学习交流QQ群:983229225Mysql复制功能介绍Mysql的复制功能提 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL安装(windows版本)相关的知识,希望对你有一定的参考价值。1.下载.MyS ... [详细]
  • phpword插件导出word文件时中文乱码问题处理方案【PHP】
    后端开发|php教程phpword,导出,中文乱码后端开发-php教程最近一个项目开发要用到PHP技术导出Word文档,比较了几种方案,首先是使用MicrosoftOffice自带 ... [详细]
author-avatar
justmoon999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有