如何快速开发一个支持高效、高并发的分布式ID生成器(一)
ID生成器是指能产生不重复ID服务的程序,在后台开发过程中,尤其是分布式服务、微服务程序开发过程中,经常会用到,例如,为用户的每个请求产生一个唯一ID、为每个消息产生一个ID等等,ID生成器也是进行无状态服务开发的重要需求之一。
ID生成器有其特殊要求:
(1) 产生的ID不能重复,在任何情况下产生的ID都不能重复,例如:在ID生成器程序重启之后,ID生成器产生的新ID不能与重启之前产生的ID重复;
(2) ID尽可能短小,由于很多情况下,ID需要被存储或者传输,因此在满足ID不重复的基础上ID长度尽可能短小,以降低存储或传输资源的浪费;
(3) 支持高并发低延时请求,ID生成器需要应付大量的请求服务,因此要提供高并发的请求,同时要求请求响应的延时时间尽可能小,一般在10毫秒以内;
(4) 支持多ID,在实际开发过程中,有太多的情形都需要ID服务,例如:每个消息、每个用户请求、每次事务的处理等等,这些不同的应用场景都需要自己的ID,因此ID生成器需要满足同时为不各应用场景产生不同ID的服务;
(5) 在特殊场合下还需要满足ID有序,例如递增或者递减;
(6) 高可靠服务,在ID生成器的实际部署过程中,可能会遇到断电、断网、程序异常崩溃等等各种奇怪的问题,因此,如何能保证ID生成器提供稳定高效的服务,是分布式服务开发过程中,首先要解决的问题。
下面将介绍如何使用redis的INCR来快速开发一个满足上述需要的ID生成器服务,INCR命令是Redis针对value为字符串操作,它要求value的最大值为64位,每次操作将redis中的value值加1,并返回递增之后的值。其架构如下所示:
使用redis作为ID生成器的数据源,为满足ID生成器的特殊要求,需特殊部署redis:
(1) 要启用两个独立的redis,这里的两个redis需要独立部署,尽量不要和其他业务复用redis;
(2) 两个redis一个为主一个为从,主提供ID生产服务,从做持久化,从而保证数据源的高效、安全;
上述部署中,按照如下方式满足ID生成器的特殊需求:
(1) 用主redis提供产生ID服务,但不进行持久化操作,Redis本身的高性能可满足ID生成器的高性能和低延时的要求,在实际测试过程中,可产生300多万/秒的ID,且请求延时为1~2毫秒;
(2) 用从Redis做持久化,保证在master挂掉之后,slave能提供服务,主从全部挂掉之后,ID数据源也被持久化到了硬盘,从而保证重新启动redis之后,ID会从持久化的位置开始产生,就不会再产生重复的ID;
(3) redis本身的key-value机制就可以提供多种ID服务,只需要为每个需求的ID产生不同的key值即可,例如在redis中消息ID的key为“id.msg”,日志ID的key值为“id.log”等等,这样消息的ID和日志的ID就可以独自完成递增操作而互补干扰。
(4) redis的INCR和DECR两个指令,可以产生递增或者递减的ID服务;
(5) redis的ID的类型最大长度为64位,可以从0开始,依次递增产生,所产生的ID就是最短的;
如果项目紧急,使用上述方式就可以很快搭建一个ID生成器服务,但是上诉ID生成器服务还存在一些缺陷:
(1) 与应用耦合高,没有对外屏蔽掉内部实现细节,例如redis,在使用时,用户完全不需要知道ID生成器使用什么产生的ID;
(2) 扩展性差,在项目规模较大时,ID的应用会非常多,如果用一个redis无法满足需求时,不方面扩展;
真正的ID生成器服务还需解决上述问题。
如何快速开发一个支持高效、高并发的分布式ID生成器(一)相关推荐
- 如何快速开发一个支持高效、高并发的分布式ID生成器(二)
前面介绍的是利用redis快速搭建一个ID生成器服务,这种方式搭建的ID生成器服务还存在一些缺陷: (1) 与应用耦合高,没有对外屏蔽掉内部实现细节,例如redis,用户完全不需要知道ID生成器 ...
- 如何快速开发一个支持高效、高并发的分布式ID生成器(三)
前面两个ID生成器只是简单的完成功能,如果实际应用到生产环境,则对ID生成器的要求更高,具体包括但不限于以下几点:(1) 产生全局唯一.且单调递增的ID: (2) 任何情况下ID不能重复或者回退: ( ...
- 基于c++11新标准开发一个支持多线程高并发的网络库
背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...
- sql server 多用户 并发_Tinyid:滴滴开源千万级并发的分布式ID生成器
Tinyid是一个ID生成器服务,它提供了REST API和Java客户端两种获取方式,如果使用Java客户端获取方式的话,官方宣称能单实例能达到1kw QPS(Over 10 million QPS ...
- 来吧,自己动手撸一个分布式ID生成器组件
在经过了众多轮的面试之后,小林终于进入到了一家互联网公司的基础架构组,小林目前在公司有使用到架构组研究到分布式id生成器,前一阵子大概看了下其内部的实现,发现还是存在一些架构设计不合理之处.但是又由于 ...
- 如何快速开发一个完整的ios直播app
如何快速开发一个完整的iOS直播app 一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形 ...
- 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模
" 架设一个亿级高并发系统,是多数程序员.架构师的工作目标. 许多的技术从业人员甚至有时会降薪去寻找这样的机会.但并不是所有人都有机会主导,甚至参与这样一个系统.今天我们用12306火车票购 ...
- FastAPI:快速开发一个文本转语音的接口
这段音频就是本文的接口生成的. Python Web 开发方面有一个很重要的环节就是开发接口,开发接口性能最好的工具就是闪电侠 FastAPI[1],正如它的名字一样,是非常快的 API.当然,还有一 ...
- 视频直播系统开发:如何应对高并发访问?
视频直播开发的挑战 随着移动互联网的快速普及,视频直播已经成为了新的社交媒体形式,也成为了一种新的商业模式.现在,越来越多的人开始使用视频直播来展示自己的生活和工作,同时,越来越多的企业开始将视频直播 ...
最新文章
- eclipse运行程序时只有run on server
- java inner class,C# Inner Class vs. java 的inner class比较-JSP教程,Java技巧及代码
- Silverlight编程模型
- 哪些医药企业使用SAP系统呢?
- curl -windows下接口通讯
- Java学习之JDK的安装与配置
- Docker的今生前世,关于Docker的一些见解
- 勘误:EOS资源抵押退还
- 计算机控制 重修,计算机控制技术重修复习提纲.doc
- java中的几个“区别”总结
- 解决 xshell 上面 zsh 的 home end 无效问题
- dagger2 使用无法自动生成dagger + component 等问题集錦
- matlab解韩信点兵问题,2019事业单位:巧解“韩信点兵”问题
- view函数--python
- 关于中文字体的设置说明(font:12px/1.5 tahoma,arial,\5b8b\4f53)
- 百度地图框选标注坐标返回标注信息
- 设计模式——代理模式(附代码示例)
- html音乐列表在线播放,HTML5 动感的音乐播放列表
- 企业微信会话存档功能开启
- 分析:人名搜索Spock会成下个谷歌吗
热门文章
- 织梦网站服务器配置,织梦本地服务器配置
- 解决MySQL8小时自动断开连接的问题(DBCP配置)
- spark java api通过run as java application运行的方法
- Apache Spark Jobs 性能调优(二)
- Fisher线性判别(*)
- html登陆l判断,html作业登陆界面
- html轮播图原理,30_用js实现一个轮播图效果,简单说下原理
- php中头部含义,PHP 常用的header头部定义汇总大全
- 【Django】毕设学习笔记(六)
- java mysql 插入 乱码_java向mysql插入数据乱码问题的解决方法