无尘阁日记

无尘阁日记

“在我看来 雪花id就是用来装逼 搞出来的一个玩意儿 ”这句话 我说对了吗?
2025-11-05

一、雪花 ID 为何会诞生?(它解决的是真问题)


多机并行写而不想碰中心服务

• Twitter 当年把 MySQL 拆成上百分库,需要不重号又要本地生成。

• 依赖数据库自增/号段,就必须走中心锁或 RPC,延迟、单点都无法接受。


要求趋势递增

• 日志、消息流、分页排序、按时间回溯都很方便。

• 比 UUID 随机写造成的 B+Tree 随机插入好得多。


64-bit 整数

• 节省存储、网络,比 UUID(16 B 二进制 / 36 B 字符串)小得多。

• 前端不想带大串字符串;数据库索引页也更紧凑。


社区与语言支持成熟

• Java、Go、Rust、Node、Python、C++ 随手就有库。

• 主流云厂商(阿里、腾讯、AWS 洛神、GCP Firestore)都给了类似生成器。


─────────────────

二、为什么会被说“装 ×”?(雪花 ID 的适用区间被无限放大)


数据量(和并发)没有到需要

• 单机 MySQL 写入 5–10 W QPS 都可搞定;

• 并不存在“必须跨 20 台机器同时写表”;

→ 直接用数据库自增 + 唯一约束足矣。


没做任何「时钟回拨、workId 唯一化」治理

• 用着用着 NTP 回拨,ID 撞库,线上挂掉;

• 结果又回退到中心号段,与初衷背道而驰。


业务根本不需要“趋势递增”

• 只是保存日志或离线报表,随机 UUID 完全 OK。

• “永远不分页、永远只点查询”——雪花 ID 意义几乎为 0。


前端、第三方对 64-bit 精度不支持

• 结果又把 int 转成 string,在接口里到处是 “1234567890123456789”

• 最后既没省带宽,也没提升体验。


“能用就上”成了团队默认习惯

• 雪花 ID 看上去高级,新人也“无脑 copy”;

• 只要带分布式字眼的系统,就先把雪花 ID 搞一套。


─────────────────

三、到底什么时候“刚需”,什么时候“装 ×”?


指标 雪花 ID = 刚需 雪花 ID = 装 ×

写入节点数 ≥5 节点、还会水平扩 单机 / 双机

单表写 QPS ≥ 10 W / 秒 几千以内

必须按插入时间有序分页 是 否

不想运维中心号段服务 是 能接受

能否治理时钟&workId 有人负责 没精力

业务寿命 > 40 年需要续约 是 否

满足左列 ≥3 条,雪花 ID 基本算“刚需”;

只有 1–2 条,且业务体量不大,用自增/UUID+映射表就很够,硬要雪花就有“装 ×”成分。


─────────────────

四、如果确实没到量级,用什么替代?


单机 / 单库:直接 AUTO_INCREMENT、SEQUENCE。

多库少并发:offset + increment(MySQL 双主常用)。

云原生、容器弹性:前缀 + 号段(Segment / Leaf)。

不需要递增、只要唯一:UUIDv4、NanoID、ULID、KSUID。

跨系统一次性迁移:映射表批量换键即可。

─────────────────

五、小结


• 雪花 ID 的诞生绝非“炫技”,而是 Twitter 时代的真实痛点。

• 但它确实被过度营销,动不动几十行业务代码就整一套发号器,带来时钟、前端精度、数据库热点等新的复杂度。

• 工程选型归根到底是成本 / 风险 / 价值平衡:

‑ 量级够、功能需要 → 上雪花,别犹豫;

‑ 量级小、能接受中心号段或自增 → 雪花往往是“装 ×”并埋雷。