分布式ID生成器的解决方案总结
转载自 分布式ID生成器的解决方案总结
在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID、退款ID等。那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要的。下面我们一一来列举一下,不一定全部适合,这些解决方案仅供你参考,或许对你有用。
一个ID一般来说有下面几种要素:
唯一性:确保生成的ID是全网唯一的。
有序递增性:确保生成的ID是对于某个用户或者业务是按一定的数字有序递增的。
高可用性:确保任何时候都能正确的生成ID。
带时间:ID里面包含时间,一眼扫过去就知道哪天的交易。
系统时间毫秒数
我们可以使用当前系统时间精确到毫秒数+业务属性+用户属性+随机数+...等参数组合形式来确保ID的唯一性,缺点是ID的有序性难以保证,要保证有序性就要依赖数据库或者其他中间存储媒介。
UUID
Java自带的生成UUID的方式就能生成一串唯一随机32位长度数据,而且够我们用N亿年,保证唯一性肯定是不用说的了,但缺点是它不包含时间、业务数据可读性太差了,而且也不能ID的有序递增。
这是一种简单的生成方式,简单,高效,但在一般业务系统中我还没见过有这种生成方式。
数据库自增ID
我们都知道为数据库主键设置自增序号,以一定的趋势自增,以保证主键ID的唯一性。
这个方案很简单,但最主要的问题在于依赖数据库本身,这就无形增加了对数据库的访问压力和依赖,一旦对单库进行分库分表或者数据迁移就尴尬了。
所以,这也不是合适的ID生成方法。
批量生成ID
一次按需批量生成多个ID,每次生成都需要访问数据库,将数据库修改为最大的ID值,并在内存中记录当前值及最大值。这样就避免了每次生成ID都要访问数据库并带来压力。
这种方案服务就是单点了,如果服务重启势必会造成ID丢失不连续的情况,而且这种方式也不利于水平扩展。
中间件
Redis的所有命令操作都是单线程的,本身提供像incr这样的自增命令,所以能保证生成的ID肯定是唯一有序的。
这种方式不依赖关系数据库,而且速度快。但系统要引入Redis这一中间件,增加维护成本,而且编码和配置工作量比较大。即使已经有了Redis组件,但生成ID的高频率访问对单线程的Redis性能势必也会造成影响。
还可以利用像Zookeeper中的znode数据版本来生成序列号,及MongoDB的ObjectId等,这种利用中间件的做法不是很推荐。
snowflake算法
如上图的所示,Twitter的snowflake算法下面几部分组成:
41位的时间序列,精确到毫秒,可以使用69年
10位的机器标识,最多支持部署1024个节点
12位的序列号,支持每个节点每毫秒产生4096个ID序号,最高位是符号位始终为0。
这种方案性能好,在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,也许有时候也会出现不是全局递增的情况。
而且这个项目在2010就停止维护了,但这个设计思路还是应用于其他各个ID生成器及变种。
UidGenerator
UidGenerator是百度开源的分布式ID生成器,基于于snowflake算法的实现,看起来感觉还行。不过,国内开源的项目维护性真是担忧。
大家可以参考具体使用:
https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md
Leaf
Leaf是美团开源的分布式ID生成器,能保证全局唯一性、趋势递增、单调递增、信息安全,里面也提到了几种分布式方案的对比,但也需要依赖关系数据库、Zookeeper等中间件。
具体可以参考官网说明:
https://tech.meituan.com/MT_Leaf.html
分布式ID生成器的解决方案总结相关推荐
- 美团(Leaf)分布式ID生成器,好用的一批!
不了解分布式ID的同学,先行去看<一口气说出 9种 分布式ID生成方式,面试官有点懵了>温习一下基础知识,这里就不再赘述了 美团(Leaf) Leaf是美团推出的一个分布式ID生成服务,名 ...
- c#分布式ID生成器
c#分布式ID生成器 简介 这个是根据twitter的snowflake来写的.这里有中文的介绍. 如上图所示,一个64位ID,除了最左边的符号位不用(固定为0,以保证生成的ID都是正数),还剩余63 ...
- 工程搭建:搭建子工程之分布式id生成器
分布式ID生成器 目前微服务架构盛行,在分布式系统中的操作中都会有一些全局性ID的需求,所以我们不能使用数据库本身的自增 功能来产生主键值,只能由程序来生成唯一的主键值.我们采用的是开源的twitte ...
- java redis id生成器_基于redis的分布式ID生成器
项目地址 基于redis的分布式ID生成器. 准备 首先,要知道redis的EVAL,EVALSHA命令: 原理 利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID. 生成的I ...
- 融云发送图片消息_IM消息ID技术专题(五):开源分布式ID生成器UidGenerator的技术实现...
1.引言 很多人一想到IM应用开发,第一印象就是"长连接"."socket"."保活"."协议"这些关键词,没错,这些确 ...
- 来吧,自己动手撸一个分布式ID生成器组件
在经过了众多轮的面试之后,小林终于进入到了一家互联网公司的基础架构组,小林目前在公司有使用到架构组研究到分布式id生成器,前一阵子大概看了下其内部的实现,发现还是存在一些架构设计不合理之处.但是又由于 ...
- 分布式id生成器:彻底解决雪花算法时间回拨问题
Butterfly 简介 雪花算法是twitter提出的分布式id生成器方案,但是有三个问题,其中前两个问题在业内很常见: 时间回拨问题 机器id的分配和回收问题 机器id的上限问题 Butterfl ...
- 推特雪花算法,分布式id生成器
推特雪花算法 分布式id生成器 package util;import java.lang.management.ManagementFactory; import java.net.InetAddr ...
- 基于Twitter的Snowflake算法实现的分布式ID生成器
/*** 基于Twitter的Snowflake算法实现的分布式ID生成器* ------------------------------------------------------------- ...
最新文章
- 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】
- 机器学习从入门到精通系列之BP神经网络理论知识详解
- 前端图片有时候能显示有时候不显示_如何自动搞定全站图片的alt属性?
- PythonOpenCV - 随机生成图像 与 图像的转维(reshape)
- 机器学习知识总结系列-机器学习中的优化算法总结(1-4)
- 用计算机表白的数字,用数字表白
- mysql怎么生成可执行文件_查询mysql数据库的java程序在myeclipse上运行正常,但生成可执行文件后查询不出结果。问题出在哪儿呢?...
- 成功的本质是——做减法
- 不支持的major.minor版本52.0 [重复]
- PaddlePaddle(4)——简单高效的部署与推理方法(Ⅰ)
- WebForm控件多字段绑定
- 大一java题库及答案_2016最新java考试题库及答案
- nodejs+vue+elementui房屋租赁网站系统 python协同过滤推荐系统
- 发那科机器人示教器键盘_不限 发那科机器人示教器触摸屏急停按键失效维修...
- oracle智能便携投影机,小火投影S10评测:让人眼前一亮的便携智能投影仪
- css fixed定位失效问题
- 从头开始学Tableau-第十七章(客户细分)
- 如何将Sublime Text 4 设置成中文版
- 【jzoj4826】【小澳的葫芦】【二分答案】
- tcl/tk参考——列表操作lsearch