分布式唯一id生成器的想法
0x01 起因
前端时间遇到一个问题,怎么快速生成唯一的id,后来采用了hashid的方法。最近在网上读到了美团关于分布式唯一id生成器的解决方案,
其中提到了三种生成法:(建议看一下这篇文章,写得很详细,分析到位)
- UUID
- 数据库生成
- 类snowflake方案
0x02 问题
文中提到了如下几个问题
1.全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。
2.趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。
3.单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。
4.信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。
上述123对应三类不同的场景,3和4需求还是互斥的,无法使用同一个方案满足。
0x03 解决思路
美团针对上面的场景,作了两种方案,Leaf-segment(数据库方式)和Leaf-snowflake(snowflake方式)。
由于之前用过hashid生成唯一id,突然觉得,我们可以保证上面的问题3和4,同时解决。
即用hashid来加密连续的id,发往客户端前先用hashid加密id,这样竞争对手就不能简单的相减订单号了。
不知道是否可用,还望大家指正。
0x04 其它方案
采用xid,xid和其它方案的对比如下:
xid的由四部分组成
- 4 byte时间戳
- 3 byte机器特征
- 2 byte 进程id
- 3 byte 随机计数器
上代码测试一下
package main
import (
"github.com/rs/xid"
)
func main() {
for i := 1; i < 20; i++ {
guid := xid.New()
println(guid.String())
}
}
生成20个id,如下:
b8t55lhafc333a3mibh0
b8t55lhafc333a3mibhg
b8t55lhafc333a3mibi0
b8t55lhafc333a3mibig
b8t55lhafc333a3mibj0
b8t55lhafc333a3mibjg
b8t55lhafc333a3mibk0
b8t55lhafc333a3mibkg
b8t55lhafc333a3mibl0
b8t55lhafc333a3miblg
b8t55lhafc333a3mibm0
b8t55lhafc333a3mibmg
b8t55lhafc333a3mibn0
b8t55lhafc333a3mibng
b8t55lhafc333a3mibo0
b8t55lhafc333a3mibog
b8t55lhafc333a3mibp0
b8t55lhafc333a3mibpg
b8t55lhafc333a3mibq0
可以看到这些id也是单调递增的,那么可以搭建一个xid的服务,调用一次返回一个id。
另外还可以生成一个id池,比如预先存储一百万个id,然后消费者批量消费,当库存
剩下一半时,立马继续生产id放入id池。
分布式唯一id生成器的想法的更多相关文章
- 百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题
UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器.而且,它非常适合虚拟环境,比如:Docker.另外,它通过消费未来时间克服了雪花算法的并发限制.Uid ...
- 分布式唯一ID生成器Twitter
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...
- snowflake 分布式唯一ID生成器
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 原文参考运维生存和开源中国上的代码整理 我的环境是pytho ...
- 分布式唯一ID生成器
在应用程序中,经常需要全局唯一的ID作为数据库主键.如何生成全局唯一ID? 首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作.缺点是字符串作 ...
- 分布式唯一id:snowflake算法思考
匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...
- 分布式全局ID生成器设计
项目是分布式的架构,需要设计一款分布式全局ID,参照了多种方案,博主最后基于snowflake的算法设计了一款自用ID生成器.具有以下优势: 保证分布式场景下生成的ID是全局唯一的 生成的全局ID整体 ...
- 关于分布式唯一ID,snowflake的一些思考及改进(完美解决时钟回拨问题)
1.写唯一ID生成器的原由 在阅读工程源码的时候,发现有一个工具职责生成一个消息ID,方便进行全链路的查询,实现方式特别简单,核心源码不过两行,根据时间戳以及随机数生成一个ID,这种算法ID在分布式系 ...
- 分布式唯一ID生成方案选型!详细解析雪花算法Snowflake
分布式唯一ID 使用RocketMQ时,需要使用到分布式唯一ID 消息可能会发生重复,所以要在消费端做幂等性,为了达到业务的幂等性,生产者必须要有一个唯一ID, 需要满足以下条件: 同一业务场景要全局 ...
- 讲分布式唯一id,这篇文章很实在
分布式唯一ID介绍 分布式系统全局唯一的 id 是所有系统都会遇到的场景,往往会被用在搜索,存储方面,用于作为唯一的标识或者排序,比如全局唯一的订单号,优惠券的券码等,如果出现两个相同的订单号,对于用 ...
随机推荐
- 【java】break outer,continue outer的使用
break默认是结束当前循环,有时我们在使用循环时,想通过内层循环里的语句直接跳出外层循环,java提供了使用break直接跳出外层循环,此时需要在break后通过标签指定外层循环.java中的标签是 ...
- 微软的开源Sonar工具测试网站的性能和安全性
Tips 原文作者:ABHIMANYU GHOSHAL 原文地址:Microsoft's open-source Sonar tool will test your site's performanc ...
- 一个简单的代码生成器(T4文本模板运用)
说要写这篇文章有一段时间了,但因为最近各方面的压力导致心情十二分的不好,下班后往往都洗洗睡了.今天痛定思痛,终于把这件拖了很久的事做了.好,不废话了,现在看看"一个简单的代码生成器" ...
- Sublime text —— 自定义主题Soda
编辑器的主题有两种,一种是语法高亮颜色主题,一种是编辑器自身显示主题,如果要自定义编辑器样式,个人推荐soda. Ctrl+Shift+p 输入install,接着输入 soda,选择 Theme ...
- echarts 认知笔记
0.echarts.setOption的核心认知 请注意,它是合并对象,而不是替换对象. 举个简单的例子,如果你第一次setOption时在series中配置了10个对象. 那么你下一次你意图使用只有 ...
- 码字工作者的发文姿势—— 用MWeb+Markdown Here+七牛 轻松实现多平台发布
码字工作者的发文姿势—— 用MWeb+Markdown Here+七牛 轻松实现多平台发布 1.对于写作你最头疼什么 对于大多数码字工作者来说,随时随地记录灵感,构思文章,集中书写,其实是一件令人 ...
- Windows 平台下Myeclipse 10 中SVN 插件使用教程(TortoiseSVN)
1. TortoiseSVN 简介 版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许 ...
- fcitx五笔的安装[zz]
Fcitx──小企鹅输入法:Free Chinese Input Toy for X是国产软件的精品,是一个以GPL方式发布的.基于XIM的简体中文输入法集合(原为G五笔),包括五笔.五笔拼音.二笔. ...
- mysql在插入或更新的时候对一个字段赋递增值
在我们有一个需求是更新某个表里面的某个字段,让这个字段变成一个递增的值,或者插入某个表中使得某些字段的值是递增的.下面我们来看看具体的操作: 更改表字段为递增 首先设置一个变量,初始值为任意数值,这里 ...
- Linux查看磁盘占用率及文件大小
查看磁盘占用率: 在 df 命令中使用-h选项,以人类易读的格式输出(例如,5K,500M 及 5G) linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令 ...