分布式id生产策略, snowflake算法


前言:分布式系统下生成不重复的id常见算法

1.算法
2.具体实现

1.算法

1.1 Twitter 的 Snowflake 算法规范

  • 整个ID是存储在int64中的63位整数
  • 41位用于存储收到请求的时间戳 - 单位毫秒
  • 10位用于存储节点 - 范围从0到1023
  • 12位用于存储序列号 - 范围从0到4095
+---------------------------------------------------------------------------+
| 1 Bit Unused | 41 Bit Timestamp |  10 Bit NodeId   |   12 Bit Sequence ID |
+---------------------------------------------------------------------------+

收到请求的时间戳需要程序运行时定义,建议定义为相对于某一时间的毫秒偏移量。例如:定义程序起始时间为2018-01-01 00:00:00.000,则用收到请求毫秒时间戳减之即可。
节点需要在程序运行前定义。
序列号需要程序运行时定义。

同一台机器上,同一毫秒内可以产生4096个id,一秒共400w个id,理论完全够用。

2.具体实现

用go实现snowflake算法
2.1 开源库

https://github.com/bwmarrin/snowflake

2.2 示例代码

package main

import (
    "github.com/bwmarrin/snowflake"
    "log"
)

func main() {
    node,err := snowflake.NewNode(1)
    if err != nil {
        log.Fatalf("newNode(1) fail, %s", err)
    }

    id := node.Generate()
    log.Printf("id %d",id) // 1067245053014970368
}

总结

非常简单的就实现id生产,算法思路简单高可用。
如果只有一个机器是不是就可以去掉节点ID?

snowflake

你可能感兴趣的:(分布式id生产策略, snowflake算法)