一、背景
4月10日晚,因某方案需要,某同事将服务器时间由4月10日 18:51分改成了4月11日18:51;
修改几分钟后触发多个业务线阈值报警,大量客诉进线;
某同事发现修改时间时未摘量,迅速将时间恢复到正常:4月10日 18:57,并将该服务器部署所有的docker实例重启;
10分钟后业务恢复正常。
服务部署情况:
k8s+docker;不同业务工程混部
问题描述
时钟被调成4月11日18:51-4月11日18:57期间,发号器生成了基于该时间段的ID,并贯穿业务全流程,同时暴露给了第三方。如果不处理数据,并继续沿用现在的算法,真正到4月11日18:51-4月11日18:57时,会产生大量ID冲突,引起二次风暴。
二、如何解决?
1、雪花算法描述
雪花算法是生成分布式唯一ID的方法之一,因为它的全局唯一性、高性能、时间有序、信息量大、高并发性能好、易于部署、不依赖第三方库等优点,被广泛应用。
我们也在雪花算法的基础上,设计了类雪花算法的分布式ID生成算法。
因为雪花算法依赖服务器时间,所以其有典型的缺点:时钟回拨问题。当时钟回拨时,会导致生成重复的ID。
不出意外的话,我们出了意外。。。
为了后面理解方便,这里简述下我们ID组成: