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

news2024/9/17 4:37:18

基于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.coloradmin.cn/o/1703097.html

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

相关文章

时空AI软件:地理信息与遥感领域的智慧引擎

在地理信息与遥感技术的广阔疆域,时空AI软件如同一颗璀璨新星,将时空信息与智能深度融合,驱动着地理信息分析、决策支持、环境监测、城市规划等领域的深刻变革。本文将深入剖析其技术核心、应用实例、未来趋势,探索时空AI软件如何…

OrangePi Kunpeng Pro 开发板测评及Python开发实测

一、背景 首先感谢 创新乐知通过CSDN 邀请本人,参与这次 评测活动。这块开发板是香橙派联合华为精心打造,具有超强算力的鲲鹏开发板。本人使用最多的还是树莓派系列的板子,国产板子特别是华为为核心的板子还是头一次使用,特别感兴…

使用 Spring Cloud Alibaba AI 构建 RAG 应用

作者:姬世文 背景介绍 RAG(Retrieval Augmented Generation) 检索增强生成(RAG)是一种用于将数据与人工智能模型集成的技术。在 RAG 工作流程中,第一步将文档数据加载到矢量数据库(例如 Redi…

【Day8:JAVA字符串的学习】

目录 1、常用API2、String类2.1 String类的特点2.2 String类的常见构造方法2.3 String类的常见面试题:2.3.1 面试题一:2.3.2 面试题二:2.3.3 面试题三:2.3.4 面试题四: 2.4 String类字符串用于比较的方法2.5 String类字…

万博智云×华为云 | HyperBDR云容灾上架,开启联营联运新篇章

日前,万博智云HyperBDR云容灾正式入驻华为云云商店,成为华为云基础软件领域联营联运合作伙伴。通过联营联运,双方将进一步加深在产品、解决方案、渠道拓展等多方面的强强联合,为企业提供更加安全、高效的数据保护解决方案&#xf…

halcon 传统缺陷检测

一、电路检测 算子解释 dyn_threshold *dyn_threshold 利用局部阈值分割图像*OrigImage (input_object):原始图像*ThresholdImage (input_object):处理后图像(一般采用滤波处理)*RegionDynThresh (output_object)&#xff1…

GpuMall智算云:QwenLM/Qwen1.5/Qwen1.5-7B-Chat

Qwen 是阿里巴巴集团 Qwen 团队的大型语言模型和大型多模态模型系列,现在大型语言模型已经升级到 Qwen1.5 版本。 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 无论是语言模型还是多模态模型,都在大规模的多语言和多模…

新楚文化知网收录文学艺术类期刊投稿

《新楚文化》是由国家新闻出版总署批准,湖北省文学艺术界联合会主管,湖北今古传奇传媒集团有限公司主办的正规期刊。主要刊登文化、文学、艺术类稿件;包括传统文化、非遗、历史文化、地方文化、中外友好文化交流、文学作品研究、艺术研究等方…

20240527每日前端-------聊聊前端input file 文件框“取消”按钮事件

文件选择窗口 正常我们使用input type"file"属性上传文件,会唤起系统的文件选择器如下: 打开按钮 可以通过change事件监听: // 增加的部分:创建 loading 实例变量 let loadingInstance;let box document.createEl…

流量分析入门

什么是流量分析 通过捕捉网络中流动的数据包,查看里面的数据和协议,流量分析和各种数据的统计来发现网络运行中的问题,在ctf中一般是一个包含流量数据的 PCAP 文件。 [陇剑杯 2021]签到 1.题目问我们正在进行的事什么协议的攻击 2.打开wire…

Spring Boot开发中常用注解总结【建议收藏】

Spring Boot 是一款非常流行的 Java 框架,其注解用法复杂而丰富。 在介绍 Spring Boot 的注解之前,我们需要先了解 Spring框架中的 AOP(面向切面编程)概念。 Spring 的 AOP 可以帮助开发者实现一些非业务功能的代码,如…

Vue3:封装Table 表格组件

组件官网 elementPlus : 点击跳转 封装组件 创建新的组件文件: Table.vue <!-- PropTableS &#xff1a; 父组件传递过来的数据 (对象)PropTableS.tables : 父组件传递的对象中 存放表格每行显示的数据PropTableS.keyS &#xff1a; 父组件传递过来的对象&#xff0c;里…

第十四 Elasticsearch介绍和安装

docker-compose安装 kibana: image: docker.elastic.co/kibana/kibana:7.5.1 container_name: kibana ports: - "5601:5601" environment: ELASTICSEARCH_HOSTS: http://elasticsearch:9200 depends_on: - elasticsearch…

所有平台均可发布,矩阵操作+工具+素材,自动混剪8090后怀旧视频

“怀旧”这个词对于80、90后来说&#xff0c;总能勾起一阵阵心中的涟漪。无论是那些留存在记忆深处的动画经典&#xff0c;还是代代相传的游戏主题曲&#xff0c;亦或是那个时代特有的玩具&#xff0c;都构成了他们共同的美好回忆。就像乘坐一艘穿梭机&#xff0c;怀旧视频能够…

Vectorworks 2024 Mac安装包下载Vectorworks 2024安装教程3D建模设计工具

安装 步骤 1&#xff0c;双击下载好的安装包&#xff0c;打开。 2&#xff0c;将G1DXHL.ldf拖到桌面上备用。 3&#xff0c;返回打开的镜像 选择install vectorworks2024 双击打开启动安装程序。电脑就90hi高腰腿疼痛和Y&Aaa9yY 4&#xff0c;输入电脑密码。 5&#xff0…

小短片创作-优化场景并输出短片(二)

1、什么是潮湿感 什么是潮湿感&#xff1a;基础颜色变化粗糙度变化表面渗入性 1.基础颜色变化&#xff1a;潮湿的地方颜色会变深 2.粗糙度变化&#xff1a;镜面粗糙度为0&#xff0c;潮湿的地方粗糙度会变低 3.表面渗入性&#xff1a;主要看材质是否防水 2、调整场景材质增…

flinkcdc 3.0 源码学习之客户端flink-cdc-cli模块

注意 : 本文章是基于flinkcdc 3.0 版本写的 我们在前面的文章已经提到过,flinkcdc3.0版本分为4层,API接口层,Connect链接层,Composer同步任务构建层,Runtime运行时层,这篇文章会对API接口层进行一个探索.探索一下flink-cdc-cli模块,看看是如何将一个yaml配置文件转换成一个任务…

2000.1-2022.06.17中国经济政策不确定性指数日度数据

2000.1-2022.06.17中国经济政策不确定性指数数据&#xff08;日度&#xff09; 1、时间&#xff1a;2001.1.1-2022.06.17 2、指标&#xff1a;CNEPU&#xff08;经济政策不确定性指数&#xff09; 3、来源&#xff1a;China Economic Policy Uncertainty Index 4、用途&…

一文了解ai问答机器人:特点、应用、影响

很多人都听过ai问答机器人这个词&#xff0c;也许对于大部分人来说&#xff0c;对它的印象就是智能&#xff01;这是不可置疑的。你在生活中肯定也接触了不少的ai问答机器人。但是关于ai问答机器人&#xff0c;你是否了解它的特点、应用领域和对人类未来的影响呢&#xff1f;Lo…

CEF框架:各种各样的Handle(四)——CefURLRequest,发起HTTP请求与处理

文章目录 CEF的HTTP请求类CefResourceRequestCefURLRequest CefURLRequest的使用cef_message_routehandled&#xff1a;urlrequet的处理类OnQuery CefURLRequestClient CEF的HTTP请求类 在CEF框架中&#xff08;Chromium Embedded Framework&#xff09;&#xff0c;CefURLReq…