首选,不管是不是分布式系统,都有 ID 唯一的使用场景。而在分布式场景下,对 ID 的唯一性要求更严格!

常见的,我们上淘宝买东西的订单 ID,就是一种分布式 ID。淘宝,前期的订单 id 好像是 14 位,现在好像已经是 16 位,或者 18 位了吧。

以我们公司的订单 ID 为例,它有这几个特点。

  1. ID 全局唯一,不会重复
  2. ID 的增长支持分布式使用
  3. ID 要方便好记,并且通过 ID 能大概看出是什么时间创建的订单
  4. 订单 ID 最好还能追踪到销售员,或下单用户的 ID 等
  5. 增长的订单 ID 还不能让竞争对手发现你每天的业务量

针对第五项,浅显的问题就是不能让非核心运营者知道每天的订单量等信息。如果 ID 是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定 URL 即可;如果是订单号就更危险了,竞对可以直接知道我们一天的订单量。所以在一些应用场景下,会需要 ID 无规则、不规则。

所以,设计一个好的分布式 ID 生成器并不是那么容易的。于是网上也有很多大公司开源这类分布式 ID 生成器。我今天就抽个时间,扯一扯它们之间的不同点吧。

说到,分布式 ID,我们首选想到的可能就是 UUID 了。

UUID

UUID (Universally Unique Identifier) 的标准型式包含 32 个 16 进制数字,以连字号分为五段,形式为 8-4-4-4-12 的 36 个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有 5 种方式生成 UUID。

UUID 的优点:性能非常高:本地生成,没有网络消耗。

UUID 的缺点:

  1. 不易于存储:UUID 太长,16 字节 128 位,通常以 36 长度的字符串表示,很多场景不适用。
  2. 信息不安全:基于 MAC 地址生成 UUID 的算法可能会造成 MAC 地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。
  3. ID 作为主键时在特定的环境会存在一些问题,比如做 DB 主键的场景下,UUID 就非常不适用。MySQL 官方有明确的建议主键要尽量越短越好,36 个字符长度的 UUID 不符合要求;UUID 还对 MySQL 索引不利,如果作为数据库主键,在 InnoDB 引擎下,UUID 的无序性可能会引起数据位置频繁变动,严重影响性能。

snowflake

snowflake 我就不在介绍了,我直接说它的优点:

  • 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。
  • 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。
  • 可以根据自身业务特性分配bit位,非常灵活。

缺点:

  • 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。

MongDB 的 ObjectID 可以算作是和snowflake类似方法,通过“时间+机器码+pid+inc”共12个字节,通过4+3+2+3的方式最终标识成一个24长度的十六进制字符。

美团开源的Leaf

支持多种不同模式的生成策略

号段模式:该模式需要建 DB 表, 需要有专门的服务来提供获取 id 的接口, 存在网络延迟

Snowflake 模式:为了追求更高的性能,需要通过 RPC Server 来部署 Leaf 服务,那仅需要引入 leaf-core 的包,把生成 ID 的 API 封装到指定的 RPC 框架中即可

缺点,可能就是相对来说比较复杂。

sharding-jdbc

sharding-jdbc 是一个开源的主键生成组件。它的特点是简单易用,可以指定 workerId 或者不指定, 直接通过 jar 的方式引入即可。看它的名字就知道,它需要 DB 支持。

uid-generator

uid-generator 是百度开源的一个分布式 ID 生成器。需要建 DB 表, 需要有专门的服务来提供获取 id 的接口, 存在网络延迟。

转载于:https://www.cnblogs.com/CQqf2019/p/11168138.html

五大分布式ID生成器优缺点及对比相关推荐

  1. 五大分布式ID生成器优缺点及对比(Java)

    首选,不管是不是分布式系统,都有 ID 唯一的使用场景.而在分布式场景下,对 ID 的唯一性要求更严格! 常见的,我们上淘宝买东西的订单 ID,就是一种分布式 ID.淘宝,前期的订单 id 好像是 1 ...

  2. 5 大分布式 ID 生成器优缺点简单对比

    点击上方"业余草",选择"置顶公众号" 第一时间获取技术干货和业界资讯! 首选,不管是不是分布式系统,都有 ID 唯一的使用场景.而在分布式场景下,对 ID 的 ...

  3. 分布式ID生成器的解决方案总结

    转载自 分布式ID生成器的解决方案总结 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们 ...

  4. 融云发送图片消息_IM消息ID技术专题(五):开源分布式ID生成器UidGenerator的技术实现...

    1.引言 很多人一想到IM应用开发,第一印象就是"长连接"."socket"."保活"."协议"这些关键词,没错,这些确 ...

  5. IM消息ID技术专题(五):开源分布式ID生成器UidGenerator的技术实现

    1.引言 很多人一想到IM应用开发,第一印象就是"长连接"."socket"."保活"."协议"这些关键词,没错,这些确 ...

  6. 美团(Leaf)分布式ID生成器,好用的一批!

    不了解分布式ID的同学,先行去看<一口气说出 9种 分布式ID生成方式,面试官有点懵了>温习一下基础知识,这里就不再赘述了 美团(Leaf) Leaf是美团推出的一个分布式ID生成服务,名 ...

  7. c#分布式ID生成器

    c#分布式ID生成器 简介 这个是根据twitter的snowflake来写的.这里有中文的介绍. 如上图所示,一个64位ID,除了最左边的符号位不用(固定为0,以保证生成的ID都是正数),还剩余63 ...

  8. 工程搭建:搭建子工程之分布式id生成器

    分布式ID生成器 目前微服务架构盛行,在分布式系统中的操作中都会有一些全局性ID的需求,所以我们不能使用数据库本身的自增 功能来产生主键值,只能由程序来生成唯一的主键值.我们采用的是开源的twitte ...

  9. java redis id生成器_基于redis的分布式ID生成器

    项目地址 基于redis的分布式ID生成器. 准备 首先,要知道redis的EVAL,EVALSHA命令: 原理 利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID. 生成的I ...

最新文章

  1. sas数据集怎么导出_[求助]如何导出sas数据集的标签?
  2. 团队软件开发第一次冲刺(二)
  3. Java设计模式(学习整理)---单例模式
  4. ASM ClassReader failed to parse class file
  5. jQuery ajax 和 普通js ajax 笔记
  6. Java案例:汉诺塔问题
  7. 【转】【异常处理】Incorrect string value: ‘\xF0\x90\x8D\x83...‘ for column... Emoji表情字符过滤的Java实现
  8. 学习 shell —— 相对路径转换为绝对路径
  9. Ardour:专业的数字音频任务站
  10. 2021 年最佳开源软件榜单出炉
  11. 小程序接入h5页面_微信小程序跳转到H5页面实战篇
  12. 锐捷交换机堆叠配置举例
  13. 英语论文拟定论文标题的基本原则
  14. 简述微型计算机的发展历程,1.1 计算机的发展历程
  15. 【】每日360题,2019.11.05日19点财会类考试习题答案
  16. 计算机维修培训教材,计算机芯片级维中心(芯片级维修培训教材)b.doc
  17. Flex使用ribbit.com的服务给手机发送短信SMS
  18. cocos creator 模拟重力爆炸效果
  19. clear 方法的解释及用法
  20. 平台化转型与轻资产化运营,如涵如何重讲网红故事?

热门文章

  1. 第1关:学习-Java集合类之Map的HashMap之常用方法的使用
  2. 初学者使用R语言读取excel/csv/txt的注意事项
  3. E: 无法下载 https://download.docker.com/linux/ubuntu/dists/Xenial/stable/binary-amd64/Packages 404 Not
  4. smeal减肥真的假的
  5. 从本地或者网络读取图片,并转换为Bitmap图片
  6. usb test mode 测试
  7. 如何提高图表设计与制作技巧,看这一文章就够了
  8. 华为战略规划落地的核心:VDBD(价值驱动业务设计模型) 盈利模式(利润模型)详细介绍
  9. linux c 获取mac地址吗,Linux系统下用C语言获取MAC地址
  10. 计算机制作技术培训,一种基于计算机网络技术的企业技术培训工作台的制作方法...