常见问题
5.0 与 4.x 兼容吗? 不兼容(D1):API、配置与存储数据都不兼容。离线迁移工具一次性迁移数据与配置; 4.x 与 5.0 绝不在同一命名空间中同时运行。
迁移之后 ID 是连续的,还是会跳变? 是连续的。5.0 沿用 4.x 的默认布局与 epoch(D16),号段从 4.x 的最大值之后继续,时间型 ID 在迁移时间 W 之后继续。
各节点的时钟必须同步吗? 对唯一性而言不需要:唯一性只依赖存储端的时间窗口不变式(D22)。时钟偏差影响的是可用性。领先存储超过 tolerance 的主机 会在接近时间窗口 ceiling 时暂停,落后于存储的主机则要等更久才能越过新的 floor。尽管如此,仍应运行 NTP。
如果进程冻结了一分钟会怎样? 恢复时,它的时间戳已超出时间窗口 ceiling:它拒绝发号(SlotWindowExceededException),直到完成续约或取得新槽位。 在此期间,另一个实例可能已持有该槽位,其时间窗口从被冻结实例的 ceiling 之后开始。
存储宕机时还能继续发号吗? 号段:直到手头的 ID 与已就绪的区间耗尽为止,大约相当于 lookahead(1s)的流量。lookahead 越长,能撑的时间越久。 Snowflake:直到时间窗口 ceiling,即最近一次续约后约 ttl − ttl/3 + tolerance。 不提供在租约丢失后继续发号的选项(P1)。
为什么号段 ID 有间隙? 允许间隙,绝不重复(D19)。重启会丢弃区间的剩余部分,等待超时与 range-ttl 过期也会如此。
一个命名空间可以容纳多少个实例? 使用租约槽位时为 2^bits(默认 1024)。号段不需要槽位。
可以在运行时删除生成器吗? 不可以(D17):生成器在启动时确定。可以将其标记为 disabled: true,或在启动前用 RuntimeSpecCustomizer 修改 spec。
如何删除旧的周期 key? 离线进行:cosid-migration purge --to … --namespace … --before 20250101,先加 --dry-run 执行。运行时代码绝不 删除 key(D23)。
应该使用哪种存储? 有数据库就用 JDBC:支持事务且简单。已经在运行 ZooKeeper 就用 ZooKeeper。追求速度用 Redis,但要满足其持久性前提。 MongoDB 需运行在副本集上。应用不应直接访问存储,或者应用不在 JVM 上时,使用 cosid-server。
