博客
关于我
雪花算法 — 集群高并发情况下如何保证分布式唯一全局ID生成?
阅读量:796 次
发布时间:2023-03-25

本文共 1065 字,大约阅读时间需要 3 分钟。

雪花算法:分布式全局唯一ID的高效解决方案

为什么需要分布式全局唯一ID

在复杂分布式系统中,数据和消息的唯一标识是至关重要的。例如,像美团点评、猫眼电影等产品的系统中,数据逐渐增长,分库分表后需要一个唯一ID标识数据或信息。订单、骑手、优惠券等都需要唯一ID作为标识。因此,一个能够生成全局唯一ID的系统显得尤为必要。

ID生成规则的硬性要求

  • 全局唯一性:ID必须唯一,避免重复,这是最基本的要求。
  • 趋势递增:数据库如MySQL的InnoDB引擎使用聚集索引,主键应尽量有序,确保写入性能。
  • 单调递增:下一个ID必须大于上一个,适用于事务版本号、IM增量消息等。
  • 信息安全:ID应无规则,防止恶意爬取和竞争对手推测。
  • 含时间戳:便于追踪生成时间。
  • ID生成系统的可用性要求

  • 高可用:99.999%的情况下保证唯一ID生成。
  • 低延迟:获取ID应极速完成。
  • 高QPS:支持高并发请求,例如10万次同时创建ID。
  • 通用方案:UUID的局限性

    • 性能:本地生成,性能较高,但无序难以预测。
    • 主键问题:UUID长度较长,不适合作为主键。
    • 索引问题:插入无序数据影响性能。

    数据库自增主键的局限

    • 扩展困难:难以支持机器台数扩展。
    • 性能瓶颈:每次获取ID需数据库读写,影响高并发处理。
    • 分库分表问题:唯一性冲突和数据一致性难以保证。

    Redis生成ID策略

    • 单机优化:Redis单线程保证原子性,性能优异。
    • 集群问题:维护复杂,难以支持高并发。

    雪花算法:高效分布式ID解决方案

    雪花算法由Twitter开发,用于生成可排序的64位分布式ID。其结构包括:

  • 41位时间戳:记录毫秒级时间,支持69年。
  • 10位机器ID:区分数据中心和服务器,支持1024台机器。
  • 12位序列号:每毫秒生成4096个ID。
  • 雪花算法的优点:

    • 高效性能:每秒生成26万ID。
    • 全局唯一性:结合数据中心和机器ID,避免重复。
    • 灵活配置:可根据业务需求调整各部分位数。

    工程落地经验

  • 工具包集成:使用Hutool工具包简化雪花算法集成。
  • SpringBoot整合:通过依赖管理和工具类实现高效ID生成。
  • 分布式应用:支持高并发场景下的多线程ID生成,确保唯一性。
  • 雪花算法的优缺点

    优点

    • 高效性能:支持高并发和高QPS。
    • 无依赖第三方:分布式部署,稳定性高。
    • 灵活配置:适应不同业务需求。

    缺点

    • 时钟问题:机器时钟回拨可能导致重复ID。
    • 递增性:分布式环境下时钟不完全同步,通常只要求趋势递增。

    其他补充

    百度和美团等公司开源了更优化的分布式ID解决方案,值得参考。

    转载地址:http://xkhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现牛顿法求一个数的平方根算法 (附完整源码)
    查看>>
    Objective-C实现牛顿法算法(附完整源码)
    查看>>
    Objective-C实现牛顿迭代法(附完整源码)
    查看>>
    Objective-C实现特征脸算法(附完整源码)
    查看>>
    Objective-C实现状态模式(附完整源码)
    查看>>
    Objective-C实现狄克斯特拉算法(附完整源码)
    查看>>
    Objective-C实现狄克斯特拉算法(附完整源码)
    查看>>
    Objective-C实现猜数字游戏(附完整源码)
    查看>>
    Objective-C实现猜数字算法(附完整源码)
    查看>>
    Objective-C实现猴子爬山算法(附完整源码)
    查看>>
    Objective-C实现环形缓冲区(附完整源码)
    查看>>
    Objective-C实现生产者和消费者问题(附完整源码)
    查看>>
    Objective-C实现生产者消费者问题(附完整源码)
    查看>>
    Objective-C实现生成 Mandelbrot 曼德勃罗集图像算法 (附完整源码)
    查看>>
    Objective-C实现生成崩溃dump文件 (附完整源码)
    查看>>
    Objective-C实现生成数组的所有不同排列算法(附完整源码)
    查看>>
    Objective-C实现生成正态分布数据(附完整源码)
    查看>>
    Objective-C实现生成随机高斯分布(附完整源码)
    查看>>
    Objective-C实现用 PIL 改变对比度算法(附完整源码)
    查看>>