Leaf是美团开源的分布式ID生成服务,支持号段模式和雪花算法模式,具有高可靠、低延迟、全局唯一等特点。以下是Leaf的详细介绍及使用示例。
1. Leaf的核心特性
- 全局唯一性:生成的ID在分布式系统中全局唯一,避免冲突。
- 高可用性:支持双Buffer机制,即使数据库宕机,也能保证服务正常运行。
- 低延迟:在高并发场景下,QPS可达5W+,TP99在1ms内。
- 灵活切换:支持号段模式和雪花算法模式,可根据业务需求灵活选择。
2. Leaf的两种模式
2.1 号段模式(Segment Mode)
- 原理:从数据库批量获取ID号段,缓存在内存中,减少对数据库的频繁访问。
- 优点:
- 减少数据库压力,适合高并发场景。
- 支持动态调整号段长度,适应流量变化。
- 缺点:
- ID不够随机,可能泄露发号数量信息。
- 依赖数据库,数据库宕机会影响服务。
使用步骤
- 创建数据库表:
CREATE TABLE `leaf_alloc` ( `biz_tag` varchar(128) NOT NULL DEFAULT '' COMMENT '业务key', `max_id` bigint(20) NOT NULL DEFAULT '1' COMMENT '当前最大ID', `step` int(11) NOT NULL COMMENT '号段长度', `description` varchar(256) DEFAULT NULL COMMENT '描述', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`biz_tag`) ) ENGINE=InnoDB;
- 配置Leaf:
在leaf.properties
中配置数据库信息:leaf.segment.enable=true leaf.jdbc.url=jdbc:mysql://localhost:3306/leaf?useUnicode=true&characterEncoding=utf8 leaf.jdbc.username=root leaf.jdbc.password=123456
- 启动Leaf服务:
访问http://localhost:8080/api/segment/get/{biz_tag}
获取ID。
2.2 雪花算法模式(Snowflake Mode)
- 原理:基于Twitter的Snowflake算法,生成64位的ID,包含时间戳、机器ID和序列号。
- 优点:
- 完全分布式,不依赖数据库。
- ID具有时间顺序,适合排序场景。
- 缺点:
- 依赖Zookeeper生成机器ID,Zookeeper故障可能影响服务。
使用步骤
- 配置Zookeeper:
在leaf.properties
中配置Zookeeper信息:leaf.snowflake.enable=true leaf.snowflake.zk.address=127.0.0.1 leaf.snowflake.port=2181
- 启动Leaf服务:
访问http://localhost:8080/api/snowflake/get/{key}
获取ID。
3. Leaf的使用示例
3.1 号段模式示例
- 初始化数据库:
INSERT INTO `leaf_alloc` (`biz_tag`, `max_id`, `step`, `description`) VALUES ('leaf-segment-test', 1, 1000, '测试号段模式');
- 启动Leaf服务:
mvn spring-boot:run
- 获取ID:
访问http://localhost:8080/api/segment/get/leaf-segment-test
,返回生成的ID。
3.2 雪花算法模式示例
- 启动Zookeeper:
确保Zookeeper服务已启动。 - 启动Leaf服务:
mvn spring-boot:run
- 获取ID:
访问http://localhost:8080/api/snowflake/get/test
,返回生成的ID。
4. Leaf的优化与扩展
- 双Buffer机制:在号段模式中,Leaf采用双Buffer缓存号段,确保在高并发场景下服务的稳定性。
- 动态调整号段长度:根据流量变化动态调整号段长度,避免频繁访问数据库。
- 支持RPC调用:可以通过改造Leaf,支持Dubbo等RPC协议,提高ID获取性能。
5. 总结
Leaf是一款功能强大、易于使用的分布式ID生成框架,支持号段模式和雪花算法模式,适用于高并发、高可用的业务场景。通过合理的配置和优化,Leaf可以满足大多数分布式系统的ID生成需求。
如果需要更详细的配置或源码,可以参考Leaf的GitHub仓库:Leaf GitHub。