分布式学习十三:实现全局唯一id命名

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 分布式学习十三:实现全局唯一id命名

全局唯一id

在单体服务中,我们可以通过数据库的自增id去实现唯一id命名,

但是在分布式服务中,分库分表之后,就无法直接使用自增id了,数据库只能保证当前表的id唯一,

这个时候我们就需要通过其他方式去生成全局唯一id,例如UUID

UUID


uuid通俗来讲,就是针对于 每个机器/机器的线程/当前的时间戳/伪随机数 作为生成凭据,能保证每个机器下的每个线程都会生成不同的id

生成的数据大概为一串无规律的数字/一串无规律的字符串 "2145562313212","e70f1357-f260-46ff-a32d-53a086c57ade"

生成的结果由不同的算法而发生改变,但是算法的原理依据都是如上

uuid的好处在于生成速度快,重复概率低(有可能重复,但是这辈子重复的概率接近0,可以不考虑)

缺点是生成的字符串没有明确的意义,甚至没有排序,另外就是数据过长,无法直接使用

zookeeper实现全局唯一id

通过zookeeper的有序节点类型,可以很方便的实现全局唯一id

package main
import (
   "errors"
   "fmt"
   "github.com/go-zookeeper/zk"
   "strings"
   "time"
)
func main() {
   conn, _, err := zk.Connect(\[\]string{"127.0.0.1:10001"}, time.Second)
   if err != nil {
      panic(err)
   }
   idPath := "/app1/tableName1/id/"
   createPath(conn, idPath)
   id,err := getGlobalID(conn, idPath)
   if err!=nil {
      fmt.Printf("%v \\n",err)
      return
   }
   fmt.Printf("Global ID: %s",id)
}
func getGlobalID(conn *zk.Conn, idPath string) (id string,err error) {
   id, err = conn.Create(idPath+"a_", \[\]byte{}, zk.FlagSequence, zk.WorldACL(zk.PermAll))
   if err != nil {
      return id,errors.New(err.Error())
   }
   fmt.Printf("Global ID:%s\\n", id)
   return id,nil
}
func createPath(conn *zk.Conn, path string) (err error) {
   strArr := strings.Split(path, "/")
   var node string
   for _, str := range strArr {
      if str == "" {
         continue
      }
      node = node + "/" + str
      exists, _, err := conn.Exists(node)
      if err != nil {
         return errors.New(err.Error())
      }
      if exists {
         continue
      } else {
         _, err = conn.Create(node, \[\]byte{}, 0, zk.WorldACL(zk.PermAll))
         if err != nil {
            return errors.New(err.Error())
         }
      }
   }
   return err
}

将输出:

image.png

通过zookeeper生成的id优点是 有序的,可以很清楚的了解到具体的数据值(你还可以把a_改为日期),这样还可以清楚这个id的创建时间等

缺点是zookeeper生成节点很慢(需要同步到其他集群节点),另外如果超过int最大值,则需要重新使用个新的父节点生成

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
4月前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
1月前
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
56 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
|
28天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
61 8
|
1月前
|
NoSQL 算法 关系型数据库
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
本文详解分布式全局唯一ID及其5种实现方案,关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
|
6月前
|
机器学习/深度学习 分布式计算 算法
联邦学习是保障数据隐私的分布式机器学习方法
【6月更文挑战第13天】联邦学习是保障数据隐私的分布式机器学习方法,它在不暴露数据的情况下,通过在各设备上本地训练并由中心服务器协调,实现全局模型构建。联邦学习的优势在于保护隐私、提高训练效率和增强模型泛化。已应用于医疗、金融和物联网等领域。未来趋势包括更高效的数据隐私保护、提升可解释性和可靠性,以及与其他技术融合,有望在更多场景发挥潜力,推动机器学习发展。
134 4
|
6月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
251 0
|
3月前
|
机器学习/深度学习 算法 自动驾驶
深度学习之分布式智能体学习
基于深度学习的分布式智能体学习是一种针对多智能体系统的机器学习方法,旨在通过多个智能体协作、分布式决策和学习来解决复杂任务。这种方法特别适用于具有大规模数据、分散计算资源、或需要智能体彼此交互的应用场景。
194 4
|
7月前
|
并行计算 算法 物联网
LLM 大模型学习必知必会系列(七):掌握分布式训练与LoRA/LISA微调:打造高性能大模型的秘诀进阶实战指南
LLM 大模型学习必知必会系列(七):掌握分布式训练与LoRA/LISA微调:打造高性能大模型的秘诀进阶实战指南
LLM 大模型学习必知必会系列(七):掌握分布式训练与LoRA/LISA微调:打造高性能大模型的秘诀进阶实战指南
|
5月前
|
存储 NoSQL Java
通用快照方案问题之通过Sleuth进行耗时分析和链路优化如何解决
通用快照方案问题之通过Sleuth进行耗时分析和链路优化如何解决
53 0
|
5月前
|
消息中间件 Java Nacos
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
83 0