这样,根据数据结构推算,snowflake算法支持的 TPS 可以达到 419 万左右(2^22*1000),相信对于绝大多数系统来说足够了。
但实现snowflake算法时,有个小问题往往被忽略,那就是要注意时钟回拨带来的影响。机器时钟如果出现回拨,产生的 ID 就有可能重复,这需要在算法中特殊处理一下。
又见时钟漂移,真是阴魂不散,NPC相关问题更多细节可参考《13.看似忠良的分布式锁》
MongoDB的ObjectID实现机制与snowflake算法类似,它占用12个字节:

如果当年GitHub使用分布式id作为MySQL主键,在发生主从切换后,新主节点与原主节点生成的id几乎不可能相同,也就不会发生用户私有数据泄露事故了。
那万一极小概率下(自增段用完+时钟加拨+机器id相同),产生重复id呢?是否会导致数据库主键重复呢?答案是不会,数据库主键具体唯一性,如果人工插入重复的主键,根据编程语言不同,代码会抛出异常或返回error。处理数据库操作异常,是所有数据库操作代码的基操之一。
这样看起来,分布式id生成算法在分布式集群中还真有可能是一个更好的选择。