设计一个每天生成百亿 ID 的服务,要求趋势递增且不能重复,你会怎么选方案?
我的判断
百亿级趋势递增 ID 我会优先采用 Snowflake 类方案,但要把时钟回拨、worker 分配、容量位数和故障切换设计完整。
每天百亿平均约 11.6 万/秒,峰值可能高一个数量级。64 位 ID 可以拆成时间戳、workerId 和序列号;例如每节点每毫秒 4096 个序列,按峰值反推节点数与位数。ID 趋势递增有利于数据库索引,但不保证全局严格按生成时间排序。
workerId 不能靠手工配置后永久相信。我会通过注册中心/租约分配并防止重复,进程只有持有有效租约才能发号。时钟回拨时,小幅可以等待,大幅则熔断该节点并告警,不能继续生成可能重复的时间段。
对外不会直接暴露可推算业务量的连续 ID;需要时再加随机业务号。生成器要监控每毫秒序列耗尽、时钟偏移、worker 冲突和发号速率,并做断网、回拨、重启和跨机房演练。
如果只是单库中等吞吐,自增 ID 最简单可靠;不会因为“分布式”三个字就引入复杂发号服务。