1. Leaf 的号段(Segment)模式与双 buffer
Leaf 的号段(Segment)模式是如何工作的,双 buffer 机制解决了什么问题?
- 号段预取与批量消耗
- 双 buffer 的预加载与切换
- 断点续取与高并发
Leaf 的号段(Segment)模式是一种"批量取号"的分布式 ID 方案:为减少数据库访问频率,Leaf 每次从数据库取一段连续的 ID(如某个区间),在内存中逐号消耗,用完后再取下一段。数据库只需维护"当前段起始值 + 步长",通过一条 UPDATE 更新段起始值即可,避免逐条写库。双 buffer 机制是:Leaf 维护两个号段 buffer(当前段与预备段),当当前段消耗到阈值(如 10%)时,后台线程立即去数据库加载下一段到预备 buffer,耗尽当前段后无缝切换,从而避免"取号时等待数据库"造成的阻塞,保证高并发下 ID 分配不间断。该方案把"数据库 IO"与"号码消耗"解耦,兼顾了吞吐与成本,是美团 Leaf 号段模式的核心。
号段模式的关键是"用一批号换一次数据库访问",双 buffer 再进一步用"提前预取 + 后台加载"消除切换时的等待。它解决了"每次取号都访问 DB"的瓶颈,也避免了"ID 用尽时服务停顿"。