高可用序列号生成器实现:时间戳同步与IP地址特征

5星 · 超过95%的资源 需积分: 48 14 下载量 79 浏览量 更新于2024-09-07 1 收藏 2KB TXT 举报
这段代码是Java实现的一个序列号生成器,主要用于生成具有时间戳、数据中心ID、工作节点ID和序列号的独特标识。序列号的生成过程考虑到了时间同步问题,确保在多节点系统中生成的ID连续且有序。 1. **序列号生成逻辑**: - `public synchronized String nextId()` 方法是整个序列号生成的核心部分。首先,它通过`timeGen()`方法获取当前的时间戳(毫秒级别)。 - 如果当前时间戳小于上一次生成的时间戳,表明系统时间可能回退,抛出异常,以避免生成不连续的ID。 - 当前时间戳与上一次相同,表示仍在同一毫秒内。这时,序列号自增(12位),与`sequenceMask`(一个掩码,用于清除序列号高位)进行按位与操作,保证序列号范围在0-4095之间。如果序列号达到4096,则会进入下一次毫秒,等待直到`tilNextMillis()`返回新的时间戳。 - 如果时间戳不同,意味着进入新的一毫秒,序列号被重置为0,从下个毫秒的序列号开始递增。 - 接下来,将数据中心ID、工作节点ID和序列号拼接成一个long类型的suffix,并与日期时间前缀格式化后字符串连接,形成最终的序列号。 2. **时间同步处理**: - `tilNextMillis(long lastTimestamp)` 方法用于在当前时间戳小于上一次生成的时间戳时,循环调用`timeGen()`,直到找到一个新的足够大的时间戳,确保序列号的连续性。 - `protected long timeGen()` 返回的是当前系统的毫秒时间戳,这是序列生成的基础。 3. **辅助方法**: - `private byte getLastIP()` 用于获取本地主机的最后一个IP地址字节,这可能是为了在生成的序列号中包含机器的唯一标识。这个方法用于增加序列号的多样性,但在这个上下文中并未直接用于序列号生成。 总结来说,这个序列号生成器采用了一种高效的方法来处理时间同步问题,确保在分布式环境中生成的ID既有序又具有唯一性。同时,通过结合时间戳、数据中心ID、工作节点ID和本地IP等信息,生成的序列号能够反映出生成时的特定上下文。