首页 >> 资讯

10分钟搞定!Golang分布式ID空集

发布时间:2023-04-13 12:18:06

根据需求进行时了魔改。

package mianimport ( "github.com/rs/xid" "fmt")func main() { // hostname+pid+atomic.AddUint32 id := xid.New() containerName := "test" // 由于xid默认使用可重复使用ip接收者填充4 5 6位。 // 非常少非常少一幕之前,增值都是布防在docker之前,这里把ip接收者位替换成了器皿名 // 这里只取了器皿名MD5的前3位,解析但会重复使用,挑弃使用 containerNameID := make([]byte, 3) hw := md5.New() hw.Write([]byte(containerName)) copy(containerNameID, hw.Sum(nil)) id[4] = containerNameID[0] id[5] = containerNameID[1] id[6] = containerNameID[2] // id: cbgjhf89htlrr1955d5g length: 12 fmt.Println("id:", id, "length:", len(id))}

ksuid

由校验和一段时间碰合组。一段时间碰九成前4字节,中间大多为校验:

package miaimport ( "github.com/segmentio/ksuid" "fmt")func main() { id := ksuid.New() // id: 2CWvPg766SUvezbiiV9nzrTZsgf length: 20 fmt.Println("id:", id, "length:", len(id)) id1 := ksuid.New() id2 := ksuid.New() // id1:2CTqTLRxCh48y7oUQzQHrgONT2k id2:2CTqTHf07C09CXyRMHdGKXnY5HP fmt.Println(id1, id2) // 全力支持ID对比,这个功能更为鸡肋了,目前没想到简单的地方 compareResult := ksuid.Compare(id1, id2) fmt.Println(compareResult) // 1 // 判断顺序性 isSorted := ksuid.IsSorted([]ksuid.KSUID{id2, id1}) fmt.Println(isSorted) // true 降序}ulid校验和一段时间碰合组package mianimport ( "github.com/oklog/ulid" "fmt")func main() { t := time.Now().UTC() entropy := rand.New(rand.NewSource(t.UnixNano())) id := ulid.MustNew(ulid.Timestamp(t), entropy) // id: 01G902ZSM96WV5D5DC5WFHF8WY length: 26 fmt.Println("id:", id.String(), "length:", len(id.String()))}

snowflake大名鼎鼎的月光插值,这里不做过多介绍了。相比之下UUID来说,月光插值但会受伤害MAC接收者非常必要、填充的ID也但会更加冗余。月光的一部分ID序列是基于一段时间碰的,那么计时回拨的原因就来了。上头讲到的xid,一定往往上避计时回拨的影响。那么什么是计时回拨,中间但会讲到。

资料库自增ID

这里正因如此是指资料库常量自增索引。特性如下:

虚拟化简单非常容需注意借助;

ID一组递增,IO写入连续性好;

INT和BIGINT多种类型九成用空间较小;

由于一组递增,需注意受伤害业绩;

受到资料库精度允许,对高并发一幕不友好。bigint最大是2And64-1,但是资料库单表无疑挑不让这么多,那么就涉及到分表。如果业绩真的太大了,常量的自增id涨到头了,但会频发什么?报错:常量紧张局势。

Redis填充ID

通过redis的价电子转换INCR和INCRBY获id。相比资料库自增ID,redis精度非常好、非常灵活。不过虚拟化强相反redis,redis在整个虚拟化之前但会产生星型原因。在水流量较少的一幕下,局域网足足也确实成为难题。

ZooKeeper唯一ID

ZooKeeper是使用了Znode结构之前的Zxid借助顺序增ID。Zookeeper类似一个应用程序,每个端口都有唯一路径名(Znode),Zxid是个当前事务触发器,每个端口频发变化都但会日志号召的发行版(Zxid),这个发行版号是当前唯一且顺序递增的。这种虚拟化还是消失了ZooKeeper的星型原因。

MMC方式也

Leaf-segment

把资料库自增常量换成了计数法。每个业务分配一个biz_tag、并日志各业务最大id(max_id)、MMC跨度(step)等数据。这样每次取号只需要非常新biz_tag对应的max_id,就可以拿到step个id。

高效率

除了包括自增ID的高效率之外,在精度上比自增ID非常好

引入灵活。

使用灵活、可配置性强。

寄存器机制,突发状况下细一段时间内能保证增值正常运转。

好处

id是一组自增,非常容需注意受伤害信息,不可用以订单。

在leaf的寄存器ID用完再去获取新MMC的缝隙,精度但会有波动。

强相反DB。

正式版Leaf-segment

正式版是对上头描述的好处2进行时的修改——双cache。在leaf的ID损耗到一定百分比时,派驻的本该进程但会而无须去MMC增值获取新的MMC并寄存器。具体损耗百分比、及MMCstep根据业务损耗速度快来定。

Tinyid

和正式版Leaf-segment类似,也是MMC方式也,提前复制到MMC。

Leaf-snowflake

计时回拨

链接上的一段时间突然倒退回之前的一段时间。确实是人为的缩减一段时间;也确实是链接之间的一段时间校对。

借助方案

用Zookeeper顺序增、当前唯一的端口发行版号,替换了原先的机器接收者。应对了计时回拨的原因。前面介绍ZooKeeper的好处,强相反ZooKeeper、大水流量下的局域网难题。右图的方案在Leaf-snowflake 之前通过寄存器一个ZooKeeper文件夹,提高需注意用性。开始运行时开始运行时,经度小于5ms但会到时经度两倍一段时间,如果经度大于5ms报警并停止开启。

早期肝硬化可以治愈吗
英特盐酸达泊西汀片提前多久吃最好
小孩不爱吃饭怎么办才能好
再林阿莫西林颗粒小孩能吃吗
宝宝积食
友情链接