分布式系统之发号器
发号器在分布式系统中是一个非常重要的组件,主要用于生成唯一的标识符,以确保系统中各个服务或节点可以正确地识别和处理请求。
发号器在分布式系统中是一个非常重要的组件,主要用于生成唯一的标识符,以确保系统中各个服务或节点可以正确地识别和处理请求。以下是关于发号器的一些关键点:
1. 唯一性
发号器的首要功能是生成唯一的ID,确保在分布式环境中没有重复的标识符。常用的生成策略包括:
- UUID:通用唯一识别码,生成的ID长度较长,适合分布式环境。
- 自增ID:在数据库中自增,适合单节点,但在分布式系统中需要注意同步和冲突。
2. 高可用性
发号器需要具备高可用性,以应对节点故障和网络分区。常见的方法包括:
- 复制:在多个节点上部署发号器,通过主从架构或分布式一致性算法(如Paxos或Raft)来确保高可用性。
- 无状态设计:尽量使发号器无状态,可以通过数据库或缓存进行 ID 的存储和管理。
3. 性能
发号器的性能直接影响到系统的吞吐量。为此可以采取以下策略:
- 批量生成:预先生成一批ID,减少实时生成的开销。
- 分布式算法:如Snowflake算法,可以在分布式环境中生成高并发的唯一ID。
4. 适用场景
发号器的设计需要根据具体的业务需求进行调整,适合场景包括:
- 数据库主键:为每一条记录生成唯一的ID。
- 事务跟踪:在分布式事务中,发号器可以帮助跟踪和管理事务的唯一性。
5. 安全性
在某些情况下,ID的生成可能需要考虑安全性,防止预测和伪造。可通过加密算法或随机数生成技术来增强ID的安全性。
通过合理设计发号器,可以显著提升分布式系统的效率和稳定性。
一、发号器特征
1)全局唯一性:保证不会出现重复ID
2)有序性:保证一定的顺序性
3)易扩展:方便扩容
4)易恢复:服务不可用时或数据能从原服务器恢复
5)高性能
二、实现发号器的方式
2.1、数据库自增
优点:
1)保证唯一性
2)保证顺序递增
3)简单
缺点:
1)分表分库后ID会重复
2)通过设置固定步长解决分表带来的问题,但扩容不方便
3)网络异常时无法判断插入是否成功,如果在执行语句时发生。网络中断,客户端无法知道事务是否成功,即使成功,也无法再获得产生的 ID
2.2、当前时间毫秒值
优点:
1)性能好
2)不依赖数据库,id能优先生成
缺点:
1)并发超过1000时,会产生重复ID
2)时钟回拨会产生重复ID
3)分布式应用不适用
2.3、UUID
优点:
1)简单、性能好
2)不受分表分库影响
缺点:
1)无法保证递增趋势
2)UUID用32位字符串,占用空间大
3)查询性能慢,作为数据库主键时,新增数据效率慢,会对索引重排序
2.4、数据库ID分组(设置不同的自增步长)
和数据库自增类似,只是设置不同的步长,可满足分布式应用ID重复的场景,但不易扩容
2.5、Snowflake算法
优点:全局唯一性,并发高,性能好,易恢复,易扩展
缺点:收时钟回拨影响
2.6、Redis键自增
三、实现思路
3.1 Snowflake算法
1)第1位:符号位,0表示正数,1表示负数,发号器第一位默认为0
2)第2-42位:时间戳,精确到毫秒
3)第43-52位:机器ID(机房ID+服务器ID)
4)第53-64位:序列号,自增长,支持同一个节点1ms可产生4096个ID
3.2 redis实现思路
1)每次预先从redis取一批有效的ID,用完后再去redis取,提高性能
2)发号器sdk保证线程安全
3)redis保证ID唯一性
更多推荐


所有评论(0)