基于Go实现的分布式主键系统

基于Go实现的分布式主键系统

摘要

随着互联网的发展,微服务得到了快速的发展,在微服务架构下,分布式主键开始变得越来越重要。目前分布式主键的实现方式颇多,有基于数据库自增的、基于UUID的、基于Redis自增的、基于数据库号段的。与此同时,越来越多的公司开始普及使用雪花算法,但是在使用的过程中,发现了雪花算法的一些问题:其一、雪花算法存在时间回拨问题;其二、雪花算法存在重复问题;其三、雪花算法不能覆盖所有的使用场景。基于现有的问题,本文开发了分布式主键系统,该系统可以解决以上问题。

1 各分布式主键介绍

1.1 雪花算法

在当前,最受欢迎的分布式主键生成算法是雪花算法,该算法由64位二进制数组成,如下图所示,它通过组合不同的二进制位来生成唯一的主键。
雪花算法组成结构图
雪花算法生成64位的唯一ID,其中包括一个固定的符号位,41位时间戳(毫秒级),10位机器标识,以及12位序列号。这保证了ID的递增性和分布式环境下的无冲突性。然而,算法的局限性在于最多支持1024个节点,且时钟回拨可能造成ID重复,这些问题在大型分布式系统中尤为突出。因此,有需求去优化现有的算法,以适应更多节点并解决时钟同步和机器标识分配问题。

1.2 基于Redis的分布式主键

Redis的命令是单线程执行的,因此可以多个服务调用递增命令而不会产生重复主键的问题,通过这种方式,程序可以确保系统在分布式环境中生成全局唯一且连续的主键。

1.3 基于MySQL的分布式主键

采用MySQL数据库的号段模式可以满足生成主键的唯一性需求,该模式将数据段分配给特定节点,其他节点无法使用,因此,号段模式能够保证数据的唯一性,实现分布式环境下的主键生成。

1.4 基于新雪花算法的分布式主键

为克服雪花算法的时间回拨和机器号重复问题,新设计的分布式主键算法依然保持64位结构,但布局调整为:最高位废弃,47位用于自增确保递增性,后面16位分为两部分各8位,用于生成随机数以增加随机性。此设计放弃了机器标识,47位自增数字通过Redis或Etcd等中间件实现,并在本地缓存,确保全局唯一且提升系统稳定性与性能。
改进雪花算法结构图
这种设计考虑了分布式环境的因素,因为在多台机器同时部署的情况下,可以借助第三方组件构建分布式系统,本文采用了与Redis的结合方式,并利用本地缓存,极大地提高了主键的生成速率。

2 分布式主键系统

2.1 涉及技术

HTTP服务端、GRPC、Protobuf、Redis操作、MySQL操作、分布式ID算法、多租户、Etcd操作

2.2 如何快速跑起来

2.2.1 配置相关
位置内容
/conf/db/ddl.sqlSQL脚本
/etc/*.yml配置文件
2.2.2 项目入口
位置内容
/guid.go项目启动入口
/server/server.go服务入口
/server/gin_server.gogin服务入口
/service/impl/db_serviceImpl.go数据库分布式主键实现
/service/impl/redis_serviceImpl.goredis分布式主键实现
/service/impl/snow_serviceImpl.go雪花算法分布式主键实现
/service/impl/new_show_serviceimpl.go基于新雪花算法分布式主键实现
2.2.3 操作步骤

从gitlab拉下来项目

goland打开项目主目录 进入terminal

执行 go mod tidy

执行 go mod vendor

安装mysql,执行ddl

安装redis和etcd

执行go run guid.go

2.3 项目设计

2.3.1 总体设计

全局唯一键,主流的实现方式有四种:

1,基于数据库的号段模式;

2,基于redis的自增模式;

3,基于雪花算法的实现模式;

4,基于新雪花算法的实现模式;

本项目实现四种方式的全局唯一键,支持集群化部署,可扩展性高

想使用某种唯一键,只需要指定类型就行,唯一键按租户和应用维度隔离

2.3.2详细设计
  • 类图
    类图

  • grpc设计

syntax = "proto3";option go_package = "gitee.com/liyouqing/guid/pb/guid;guid";message Req{string namespace = 1;   // 命名空间TYPE type = 2;          // key的类别enum TYPE{              // 主键类型SNOW = 0;REDIS = 1;DB = 2;NEWSHOW = 3;}
}message Res{bool  flag =1 ;    //成功失败标志string key = 2;    //返回的全局id实体
}service PbGuid{rpc GetKey(Req) returns (Res);
}
  • 释义:

使用protobuf 定义两个message 一个请求,一个返回

使用grpc定义了一个服务,服务的中有一个方法,使用上述定义的请求和返回作为入参和出参

2.3.3 rpc远程调用

go项目需要该功能时,需要拿到该proto的文件

然后,通过命令生成相关结构体和grpc调用相关的东西

然后参考

/server/server_client_test.go

2.3.4 gin服务 restapi调用

通过 gin服务 添加http查询接口

url localhost:8080/gitee.com/liyouqing/guid/get-key?namespace=nihao&type=2 请求方式 Get

请求参数 type 0:雪花算法 1:redis分布式 2:数据库号段 3:新雪花算法

返回数据

{"status":0,"msg":"success","data": "70001"
}

3 对比试验结果

算法耗时(十万条)速度重复次数随机性自增趋势
雪花算法12.47秒3
优化的雪花算法12.46秒0
基于Redis的主键生成算法21.50秒0
基于MySQL的主键生成算法11.86秒0
新雪花算法12.22秒0

4 总结

本人进行了大量工作,优化了雪花算法,解决了性能和可靠性问题,还实现了基于数据库和缓存的两种分布式主键生成算法。通过对比实验发现,这些算法都有各自的优势和适用领域。最后,基于这些算法开发了分布式主键系统,提升了数据写入能力和稳定性,避免了重复主键的产生,具有极高的现实价值。

5 附录

gitee项目地址

集成grpc的操作可以参考 go集成grpc
Mysql、Redis、Etcd的安装自行百度,在此不再赘述!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探寻最强性能云电脑:ToDesk云电脑、无影云、网易云游戏、易腾云横测大比拼

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

恶劣天候鲁棒三维目标检测论文整理

恶劣天候鲁棒三维目标检测论文整理 Sunshine to Rainstorm: Cross-Weather Knowledge Distillation for Robust 3D Object DetectionRobo3D: Towards Robust and Reliable 3D Perception against CorruptionsLossDistillNet: 3D Object Detection in Point Cloud Under Harsh W…

基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 ADRC原理 4.2 线性误差反馈控制律(LSEF) 4.3 ADRC-LSEF融合系统 5.完整工程文件 1.课题概述 基于自抗扰控制器和线性误差反馈控制律(ADRC-LSEF)的控制系统simulink建模与仿真。 2.系统仿真结果 …

测试驱动编程(3)进阶单元测试(下)

文章目录 测试驱动编程(3)进阶单元测试(下)示例实战接收同事的需求开始迭代需求故事迭代1故事迭代2故事迭代3故事迭代4故事迭代5故事迭代6 测试驱动编程(3)进阶单元测试(下) 示例实战 接收同事的需求 你的同事正在开发一个远程…

【PROXYCHAINS】Kali Linux 上配置NAT PROXYCHAINS保姆级教程

kali linux配置agent 在博主配置kali 的时候遇到了一些小问题,主要就是连接一直报错超时。 方法一:优点:免费,但是agent很不稳定 搜索免费ip,在Google搜索free proxy list 检查可用ip 连接成功 cd /etcls |grep redsnano reds…

IDEA中一些常见操作【持续更新】

文章目录 前言善用debugidea中debug按钮不显示自动定位文件【始终选择打开的文件】idea注释不顶格【不在行首】快速定位类的位置【找文件非常快】创建文件添加作者及时间信息快速跳转到文件顶端 底端 前言 因为这些操作偶尔操作一次,不用刻意记忆,有个印…

苹果CMS:怎么重新安装

当我们安装好苹果CMS之后苹果cms:介绍及安装,但是最好我们在安装的时候配置好对应配置后,备份一份,如果不记得哪里配置出了问题,出现一些不可预料的问题,那我们可以简单暴力的直接重新安装,我们…

211初试自命题复试线仅302分!延边大学计算机考研考情分析!

延边大学(Yanbian University),简称“延大”,地处吉林省延边朝鲜族自治州,是国家“双一流”建设高校、国家“211工程”重点建设大学、西部开发重点建设院校、吉林省人民政府和教育部共同重点支持建设大学、吉林省人民政…

计算机如何将输入文字显示出来的?渲染Image rendering

1.文字渲染的简单理解 渲染图像,可以理解为用cpu/gpu构造出原本不存在的图像。比如输入计算机的英文字符都是ASCII码,而我们在屏幕上看到显示的字符对应的应该是RGB/YUV的像素。计算机把ASCII字符转化成像素的过程就是文字渲染。又比如我们GPU用多个2D图…

DolphinDB 携手九鞅科技,助力固收投研效能飞跃

随着金融市场开放的广度与深度不断拓宽,金融产品呈现出多样化的发展态势,其中债券投资组合凭借其低风险性、高流动性与稳健的收益表现,逐渐成为投资理财领域备受瞩目的焦点。投资经理不仅需要了解哪些债券值得投资,更要对债券投资…

web4.0-元宇宙虚拟现实

互联网一直在不断演变和改变我们的生活方式,从Web逐渐 1.0时代的静态网页到Web 2.0时代的社会性和内容制作,再从Web逐渐 在3.0阶段,互联网发展一直推动着大家时代的发展。如今,大家正站在互联网演化的新起点上,迈入Web…

微信hook协议3.84最新版

PC微信接口使用说明 用户故事 更新日志 登录与退出 获取进程端口占用信息 获取微信进程总数 启动微信 点击登陆微信 刷新并获取登录二维码 获取登录二维码数据(可以不调用) 获取微信登陆状态 退出微信 结束微信 个人信息管理 获取个人详细信息 保存收款码 获取本人地址 修改本人…

如何彻底搞懂装饰器(Decorator)设计模式?

对于任何一个软件系统而言,往现有对象中添加新功能是一种不可避免的实现场景,但这一实现过程对现有系统的影响可大可小。从架构设计上讲,我们也知道存在一个开闭原则(Open-Closed Principle,OCP)&#xff0…

【简单介绍下7-Zip,什么是7-Zip?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

C++语言学习(五)—— 类与对象(一)

目录 一、类类型的定义 二、类成员的访问控制 2.1 什么是"类内"和"类外" 2.2 对于访问控制属性的说明 三、类类型的使用 3.1 进行抽象 3.2 声明类 3.3 实现类 3.4 使用类 四、构造函数的引入 五、析构函数的引入 六、重载构造函数的引入 6.1 …

一文读懂“双随机、一公开”:企业监管新风向

在这个信息透明化、法治化日益增强的时代,政府对企业监管的方式也在不断创新和完善。“双随机、一公开”作为一种新型监管模式,正逐渐成为市场监管领域的关键词。对于企业或个体工商户而言,了解并适应这一监管机制,对于维护自身合…

工具分享:VsCode注释神器,koro1FileHeader

他是有官方Wiki的。 https://github.com/OBKoro1/koro1FileHeader/wiki/ 项目在GitHub上开源。以下摘录部分wiki,用作介绍分享在这里插入代码片 如何找到setting.json设置模板 简单的输入命令 打开VSCode命令面板: mac: command p window: ctrl p输入> Ope…

9.5 Go语言入门(条件语句和循环语句)

Go语言入门(条件语句和循环语句) 目录四、条件语句和循环语句1. 条件语句1.1 if 语句1.2 if-else 语句1.3 if-else if-else 语句1.4 带初始化语句的 if1.5 switch 语句1.6 带条件的 switch1.7 多个条件的 case 2. 循环语句2.1 基本 for 循环2.2 省略初始…

从零开始搭建SpringCloud Alibaba微服务架构

Spring Cloud Alibaba是Spring Cloud的一个拓展项目,它用于构建基于阿里巴巴的微服务应用。它提供了多个阿里巴巴的开源组件,如Nacos、Sentinel、Dubbo等,用于解决微服务架构中的服务注册、配置管理、流量控制等问题。 Spring Cloud Alibaba…

记.netcore部署到银河麒麟linux服务器过程详解

一.服务器配置 操作系统:银河麒麟桌面操作系统V10 CPU:intel i5 内存:16G 内核:5.10.0.8-generic 未激活 二.运行环境安装 .netcore 6.0 runtime时安装下载离线包 Download .NET 6.0 (Linux, macOS, and Windows) -下载完后进行解压 sudo su #提权 mkdir -p $HOME/…