uuid

package
v0.6.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 11, 2022 License: BSD-3-Clause Imports: 14 Imported by: 0

README

uuid

分布式ID生成

Usage

// 初始化传入workerID, etcd地址,和命名空间前缀
var storage = NewRedisStore(...)
uuid.Init(workerID, storage)

// 返回一个ID,使用发号器算法,可用于角色、工会ID
id := uuid.NextID()

// 返回一个UUID,使用雪花算法,可用于事件行为、日志ID,通常值比较大
uuid := uuid.NextUUID()

// GUID string, standard universally unique identifier version 4
guid := uuid.NextGUID()

雪花算法
时间戳 WorkerID SeqID
  • 把一个64位的整数分成3个区间,分别用于时间戳workerIDseqID
  • 时间戳代表时间单元需要一直递增,不同的时间单元实现有毫秒、秒、厘秒等,这里依赖时钟不回调;
  • workerID用来标识分布式环境下的每个service;
  • seqID在一个时间单元内持续自增,如果在单个时间单元内seqID溢出了,需要sleep等待进入下一个时间单元;

不同的雪花算法实现的差异主要集中在3个区间的分配,和workerID自动还是手动分配上。

  • sony的实现 https://github.com/sony/sonyflake
  • 百度的实现 https://github.com/baidu/uid-generator
  • 美团的实现 https://github.com/Meituan-Dianping/Leaf
发号器算法
  • 算法把一个64位的整数按step划分为N个号段;
  • 每个service向发号器申请领取一个代表号段的counter;
  • service内部使用这个号段向业务层分配ID;
  • service重启或者号段分配完,向发号器申请下一个号段;
  • 要求底层存储不能随意被修改影响到上层算法分配;

发号器依赖存储组件,对存储组件的需求是能实现整数自增

本包提供多种存储选择,etcd、redis和mongodb

Documentation

Index

Constants

View Source
const (
	SequenceBits       = 10
	MachineIDBits      = 14
	TimeUnitBits       = 37
	MaxSeqID           = (1 << SequenceBits) - 1
	MachineIDMask      = 0x3FFFF
	TimestampShift     = MachineIDBits + SequenceBits
	MaxTimeUnits       = (1 << TimeUnitBits) - 1
	BackwardsMaskShift = TimeUnitBits + MachineIDBits + SequenceBits

	TimeUnit    = int64(time.Second / 100)        // 厘秒(10毫秒)
	CustomEpoch = int64(1577836800 * time.Second) // 起始纪元 2020-01-01 00:00:00 UTC
)
View Source
const (
	CollectionName = "uuid"
)
View Source
const (
	DefaultSeqStep = 2000 // 默认每个counter分配2000个号
)
View Source
const OpTimeout = 3000

DB超时(毫秒)

Variables

View Source
var (
	ErrClockGoneBackwards = errors.New("clock gone backwards")
	ErrTimeUnitOverflow   = errors.New("clock time unit overflow")
	ErrUUIDIntOverflow    = errors.New("uuid integer overflow")
)
View Source
var (
	ErrCannotPutEtcd = errors.New("cannot put counter to etcd")
)
View Source
var ErrIDOutOfRange = errors.New("ID out of range")

Functions

func Init

func Init(workerId uint16, store Storage) error

func NextGUID

func NextGUID() string

生成GUID

func NextID

func NextID() int64

生成依赖存储,可用于角色ID

func NextUUID

func NextUUID() int64

生成的值与时钟有关,通常值比较大,可用于日志ID

Types

type Counter

type Counter struct {
	Label string `bson:"label"` // 识别符
	Count int64  `bson:"count"` // 计数器
	Step  int32  `bson:"step"`  //
}

计数器

type EtcdStore

type EtcdStore struct {
	// contains filtered or unexported fields
}

使用etcd的key的版本号自增实现

func (*EtcdStore) Close

func (s *EtcdStore) Close() error

func (*EtcdStore) Incr

func (s *EtcdStore) Incr() (int64, error)

type IDGenerator

type IDGenerator interface {
	Next() (int64, error)
}

type MongoStore

type MongoStore struct {
	// contains filtered or unexported fields
}

func (*MongoStore) Close

func (s *MongoStore) Close() error

func (*MongoStore) Incr

func (s *MongoStore) Incr() (int64, error)

type RedisStore

type RedisStore struct {
	// contains filtered or unexported fields
}

使用redis INCR命令实现

func (*RedisStore) Close

func (s *RedisStore) Close() error

func (*RedisStore) Incr

func (s *RedisStore) Incr() (int64, error)

type SeqIDGen

type SeqIDGen struct {
	// contains filtered or unexported fields
}

使用发号器算法的uuid生成器 1. 算法把一个64位的整数按step范围划分为N个号段; 2. service从发号器拿到号段后才可分配此号段内的ID; 3. 发号器依赖存储(etcd, redis等)把当前待分配号段持续自增;

func NewSeqIDGen

func NewSeqIDGen(store Storage, step int32) *SeqIDGen

func (*SeqIDGen) Init

func (s *SeqIDGen) Init() error

func (*SeqIDGen) MustNext

func (s *SeqIDGen) MustNext() int64

func (*SeqIDGen) Next

func (s *SeqIDGen) Next() (int64, error)

type Snowflake

type Snowflake struct {
	// contains filtered or unexported fields
}

一个64位UUID由以下部分组成

1位符号位
2位时钟回拨标记,支持时钟被回拨3次
37位时间戳(厘秒),可以表示到2063-07-21
14位服务器ID
10位序列号,单个时间单位的最大分配数量

func NewSnowflake

func NewSnowflake(machineId uint16) *Snowflake

func (*Snowflake) MustNext

func (sf *Snowflake) MustNext() int64

func (*Snowflake) Next

func (sf *Snowflake) Next() (int64, error)

Next generate an ID, panic if time gone backwards or integer overflow

type Storage

type Storage interface {
	Incr() (int64, error)
	Close() error
}

Storage表示一个存储组件,维持一个持续递增(不一定连续)的counter

func NewEtcdStore

func NewEtcdStore(cli *clientv3.Client, key string) Storage

func NewMongoDBStore

func NewMongoDBStore(uri, db, label string, step int32) Storage

func NewRedisStore

func NewRedisStore(addr, key string) Storage

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL