分布式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

推荐阅读更多精彩内容

  • pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 ...
    王震阳阅读 84,060评论 27 525
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 3,944评论 4 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 80,158评论 13 120
  • 文章转载自公众号“达达京东到家技术”。 背景 在分布式系统中,经常需要对大量的数据、消息、http 请求等进行唯一...
    淡淡的橙子阅读 1,807评论 1 43
  • 半夏在屏幕里面看起来格外好看,肤若凝脂,唐容一向紧闭的嘴角也开心的灿烂着。 “可是我……我现在真的很忙。”分身乏术...
    麻花饺子阅读 25评论 0 0