前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式环境下生成全局唯一ID?看看美团怎么做!

分布式环境下生成全局唯一ID?看看美团怎么做!

作者头像
程序员牛肉
发布2024-09-26 13:01:59
590
发布2024-09-26 13:01:59
举报
文章被收录于专栏:小牛肉带你学Java

大家好,我是程序员牛肉。

生成全局唯一ID在分布式系统中是一项很核心的技术。全局唯一ID保证了分布式系统下数据的唯一性,避免了很多问题。

而探讨如何高效的生成全局唯一ID一直都是一个热门话题,各个大厂也给出了自己的解决方案。

今天我们来看一看美团在自己公开的技术文档中分享的一个方案:“LEAF数据库方案”

美团的生成方案的底层是在数据库中进行生成全局唯一ID。因此在之前我们要先简单讲一下数据库生成全局唯一ID。

我们可以设计这样一个表来在数据库中生成全局唯一ID:

代码语言:javascript
复制
create table order_test.order_id
(
    id   int auto_increment
        primary key,
    name varchar(20) null,
    constraint name
        unique (name)
);

那么我们就得到了这样一张表:

在查询的时候,我们使用这样一条语句:

代码语言:javascript
复制
begin ;
replace into order_id (name) values ("order_id");
SELECT last_insert_id();
COMMIT ;

这样我们基于name的唯一性,就做到了对id的自增:

而这种简单的使用一张表来维护全局唯一ID的方式并不安全:

在高并发环境下,万一这张表崩掉怎么办?

所以为了优化,我们又采用了多表的思想,例如我们可以用两张表,一个表维护订单id为偶数,一个表维护订单id为奇数。

这样的话,我们就是实现了减轻单表压力。而且这种思想是可以不断的改进的,我们可以通过让表维护不同类型的数字来不断的拆表,减轻单表压力。

而且这种方式如果要抵抗高并发的话,就要不断的去加数据库,对维护数字进行分类。因此这种方式其实缺点还是比较明显的。

但其实基于数据库构造全局唯一ID是有成熟的方案的:美团的LEAF数据库方案。

LEAF数据库方案简而言之就一句话:批量获取ID进行处理。

在上文我们简单的对数据库进行优化的时候,优化方向基本都来源于高并发下数据库高频的读写操作。

而LEAF数据库方案也是针对这个方面进行优化的。

我们可以把图中的leaf简单的理解为是一个生成全局唯一ID的服务。那么整个LEAF数据库的思想就是:leaf服务提前就拿好一批号端,例如从0-1000。那么我在生成唯一ID的时候,压力就从数据库转到了Leaf这个服务里面。

优点:

1.leaf只是一个简单的web服务,方便进行扩展。

2.ID号也满足趋势递增的要求

3.容灾性高,由于生成唯一ID的是leaf服务,而且内部有号段缓存,因此即使数据库挂了,短时间内也可以正常对外提供服务

缺点:

当所有的leaf用完自己的号段之后,就会向数据库再次请求号段,此时leaf服务是不可用的。而如果此时有大量的请求leaf服务,就会引发一段尖刺。

解决方案:

我们并不会等到号段全部用完之后再去请求新的号段。美团给出的技术方案是当号段消费到某个点时就异步的把下一个号段加载到内存中。而不需要等到号段用尽的时候才去更新号段。

一开始先用A号段,等 A号段消耗到10%的时候,就向数据库请求新号段。之后当前号段消耗完之后就可以进行快速的切换。如此循环往复。

相信通过我的介绍,你已经了解什么是“LEAF数据库方案”。希望我的文章可以帮到你。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员牛肉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档