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生成器(一)相关推荐

  1. 如何快速开发一个支持高效、高并发的分布式ID生成器(二)

    前面介绍的是利用redis快速搭建一个ID生成器服务,这种方式搭建的ID生成器服务还存在一些缺陷: (1)    与应用耦合高,没有对外屏蔽掉内部实现细节,例如redis,用户完全不需要知道ID生成器 ...

  2. 如何快速开发一个支持高效、高并发的分布式ID生成器(三)

    前面两个ID生成器只是简单的完成功能,如果实际应用到生产环境,则对ID生成器的要求更高,具体包括但不限于以下几点:(1) 产生全局唯一.且单调递增的ID: (2) 任何情况下ID不能重复或者回退: ( ...

  3. 基于c++11新标准开发一个支持多线程高并发的网络库

    背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...

  4. sql server 多用户 并发_Tinyid:滴滴开源千万级并发的分布式ID生成器

    Tinyid是一个ID生成器服务,它提供了REST API和Java客户端两种获取方式,如果使用Java客户端获取方式的话,官方宣称能单实例能达到1kw QPS(Over 10 million QPS ...

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

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

  6. 如何快速开发一个完整的ios直播app

    如何快速开发一个完整的iOS直播app 一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形 ...

  7. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模

    " 架设一个亿级高并发系统,是多数程序员.架构师的工作目标. 许多的技术从业人员甚至有时会降薪去寻找这样的机会.但并不是所有人都有机会主导,甚至参与这样一个系统.今天我们用12306火车票购 ...

  8. FastAPI:快速开发一个文本转语音的接口

    这段音频就是本文的接口生成的. Python Web 开发方面有一个很重要的环节就是开发接口,开发接口性能最好的工具就是闪电侠 FastAPI[1],正如它的名字一样,是非常快的 API.当然,还有一 ...

  9. 视频直播系统开发:如何应对高并发访问?

    视频直播开发的挑战 随着移动互联网的快速普及,视频直播已经成为了新的社交媒体形式,也成为了一种新的商业模式.现在,越来越多的人开始使用视频直播来展示自己的生活和工作,同时,越来越多的企业开始将视频直播 ...

最新文章

  1. eclipse运行程序时只有run on server
  2. java inner class,C# Inner Class vs. java 的inner class比较-JSP教程,Java技巧及代码
  3. Silverlight编程模型
  4. 哪些医药企业使用SAP系统呢?
  5. curl -windows下接口通讯
  6. Java学习之JDK的安装与配置
  7. Docker的今生前世,关于Docker的一些见解
  8. 勘误:EOS资源抵押退还
  9. 计算机控制 重修,计算机控制技术重修复习提纲.doc
  10. java中的几个“区别”总结
  11. 解决 xshell 上面 zsh 的 home end 无效问题
  12. dagger2 使用无法自动生成dagger + component 等问题集錦
  13. matlab解韩信点兵问题,2019事业单位:巧解“韩信点兵”问题
  14. view函数--python
  15. 关于中文字体的设置说明(font:12px/1.5 tahoma,arial,\5b8b\4f53)
  16. 百度地图框选标注坐标返回标注信息
  17. 设计模式——代理模式(附代码示例)
  18. html音乐列表在线播放,HTML5 动感的音乐播放列表
  19. 企业微信会话存档功能开启
  20. 分析:人名搜索Spock会成下个谷歌吗

热门文章

  1. 织梦网站服务器配置,织梦本地服务器配置
  2. 解决MySQL8小时自动断开连接的问题(DBCP配置)
  3. spark java api通过run as java application运行的方法
  4. Apache Spark Jobs 性能调优(二)
  5. Fisher线性判别(*)
  6. html登陆l判断,html作业登陆界面
  7. html轮播图原理,30_用js实现一个轮播图效果,简单说下原理
  8. php中头部含义,PHP 常用的header头部定义汇总大全
  9. 【Django】毕设学习笔记(六)
  10. java mysql 插入 乱码_java向mysql插入数据乱码问题的解决方法