前言

系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结。
这篇文章就是给各位看官提供一个生成分布式唯一全局id生成方案的思路,希望能帮助到大家。

问题

为什么需要分布式全局唯一ID以及分布式ID的业务需求?

在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识,如在美团点评的金融、支付、餐饮、酒店
猫眼电影等产品的系统中数据逐渐增长,对数据库分库分表后需要有一个唯一ID来标识一条数据或信息;
比如订单、骑手、优惠券都需要有唯一ID做标识,此时一个能够生成全局唯一ID的系统是非常必要的。
高并发下,如何保证分布式唯一全局 ID 生成? - 图1

ID生成规则部分硬性要求

  • 全局唯一
  • 趋势递增
  • 在MySQL的InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用Btree的数据结构来存储索引,在主键的选择上面我们应该尽量使用有序的主键保证写入性能
  • 单调递增
  • 保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求
  • 信息安全
  • 如果ID是连续,恶意用户的爬取工作就非常容易做了,直接按照顺序下载指定URL即可,如果是订单号就危险了,竞争对手可以直接知道我们一天的单量,所以在一些应用场景下,需要ID无规则不规则,让竞争对手不好猜
  • 含时间戳
  • 一样能够快速在开发中了解这个分布式ID什么时候生成的

    ID号生成系统的可用性要求

  • 高可用

  • 发布一个获取分布式ID请求,服务器就要保证99.999%的情况下给我创建一个唯一分布式ID
  • 低延迟
  • 发一个获取分布式ID的请求,服务器就要快,极速
  • 高QPS
  • 例如并发一口气10万个创建分布式ID请求同时杀过来,服务器要顶得住且一下子成功创建10万个分布式ID

一般通用解决方案