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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,169评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,957评论 19 139
  • 文章转载自公众号“达达京东到家技术”。 背景 在分布式系统中,经常需要对大量的数据、消息、http 请求等进行唯一...
    淡淡的橙子阅读 6,173评论 1 41
  • 半夏在屏幕里面看起来格外好看,肤若凝脂,唐容一向紧闭的嘴角也开心的灿烂着。 “可是我……我现在真的很忙。”分身乏术...
    麻花饺子阅读 315评论 0 0
  • 一个巧遇的机缘 让我认识了你 我与诗友飞向了你的领地 一一《火星文艺》 新鲜的空气 净化着我们的心灵 纯洁的水域 ...
    吉羊玉奕v阅读 245评论 12 15