基于 Snowflake 算法的分布式订单号生成器,使用 ZooKeeper 进行节点管理和协调。
- 基于 Snowflake 算法生成全局唯一的订单号
- 使用 ZooKeeper 进行节点管理和协调
- 支持自定义起始时间戳(epoch)
- 自动处理节点 ID 分配
- 支持时间回滚检测和处理
- 提供健康检查接口
- 支持优雅关闭
-
订单号生成服务
- 基于 Snowflake 算法
- 支持自定义起始时间戳
- 41位时间戳 + 10位节点ID + 12位序列号
- 时间回滚检测和处理机制
-
ZooKeeper 协调服务
- 节点注册和管理
- 节点 ID 分配
- 节点状态监控
- 自动故障转移
-
HTTP API 服务
- 订单号生成接口
- 健康检查接口
- 优雅关闭支持
-
启动流程
服务启动 -> 连接 ZooKeeper -> 获取节点 ID -> 初始化 Snowflake 节点 -> 启动 HTTP 服务 -
订单号生成流程
接收请求 -> 检查时间回滚 -> 生成订单号 -> 返回结果 -
节点管理流程
定期更新节点信息 -> ZooKeeper 心跳检测 -> 自动故障转移
PORT: HTTP 服务端口(默认:8100)HOSTNAME: 节点主机名(用于节点标识)
// config/config.go
var (
ZKPath = "/snowflake" // ZooKeeper 根路径
ZKPersistentPath = "/snowflake/nodes" // 持久节点路径
ZKEphemeralPath = "/snowflake/alive" // 临时节点路径
ZKUpdateInterval = 1 * time.Second // 节点信息更新间隔
)// config/config.go
var (
// 时间戳位数:41位,可以使用约69年
timestampBits = 41
// 节点ID位数:10位,支持1024个节点
nodeIDBits = 10
// 序列号位数:12位,每毫秒支持4096个序列号
sequenceBits = 12
// 自定义起始时间戳,默认为 2024-01-01 00:00:00 UTC
SnowflakeEpoch = time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli()
)// config/config.go
var (
// 时间回滚检测阈值
TimeBackwardThreshold int64 = 10
)GET /order-id
Response: 1234567890123456789
GET /health
Response: 服务正常,节点 ID: 1
- Go 1.23.2 或更高版本
- ZooKeeper 3.4.0 或更高版本
go build -o order-id-generator# 设置环境变量
export PORT=8100
export HOSTNAME=node1
# 运行服务
./order-id-generator- 使用 logrus 进行日志记录
- 支持结构化日志
- 包含详细的错误信息和警告
- 定期检查 ZooKeeper 连接状态
- 监控节点状态
- 检测时间回滚
- 自动重连 ZooKeeper
- 节点 ID 自动重新分配
- 时间回滚检测和处理
- 使用互斥锁保护关键操作
- 支持每毫秒生成 4096 个唯一 ID
- 支持最多 1024 个节点
- ID 可以使用约 69 年(从自定义起始时间开始)
- 确保服务器时间同步
- 监控时间回滚情况
- 合理设置节点数量
- 定期检查 ZooKeeper 连接状态
- 注意自定义起始时间戳的设置,确保有足够的使用时间
- 支持更多的配置选项
- 添加监控指标
- 优化性能
- 增加更多的容错机制
- 支持动态配置更新