如果你正在寻找一种全局唯一ID生成策略,那么我相信你一定会了解到一种算法,那就是雪花算法,如果再深入了解一下,你会发现雪花算法其实不单单只是一种算法,同时也是一种思想,它将ID细分为时间戳、机器号、序列号等几个关键部分。时间戳用来保持ID的递增趋势,机器号用来区分相同时刻下不同机器所生成的ID,序号用来区分同一个机器相同时刻下生成的ID。关于雪花算法的实现网上有很多现成代码可以借鉴,同时你也可以基于这种思想自己实现一个雪花算法。
如何实现自定义的雪花算法?
无论是自己实现的雪花算法还是网上借鉴的雪花算法,在集群环境中都面临着一个问题:在什么地方维护机器号?
前两种方案不符合预期,第三种方案需要引入zookeeper中间件,成本过高,于是这三种方案都被我Pass了,苦思冥想了好几天,终于找到了一个相对轻量级的替代方案——基于redis实现。
首先列出我的需求,我希望系统中的雪花算法实例可以满足如下场景
受到Redission思路的启发,可以在应用启动时向redis注册一个未使用的机器号并设置过期时间,然后再通过一个线程定时续约,这样一来就可以满足上述场景了。具体过程如下
此方案应该可以满足绝大多数场景,略微有些不足之处是时效性不强,系统down机后要经过一段时间才会释放机器号(上述例子中是两小时)。如果在机器号失效期间内频繁发包也会导致无机器号可用的情况。此时可以根据需要自行调节机器号有效时间以及续约的时间间隔。
我的公众号是《敲得码黛》,一个不知名的IT程序员,欢迎大家关注我的个人公众号,一起学习,一起成长!