微服务全局ID方案汇总
自增id
对于大多数系统来说,使用mysql的自增id当作主键再最合适不过了。在数据库层面就可以获取一个顺序的、唯一的、空间占用少的id。
自增id需要是 int、bigint这些整数类型,uint 支持 40 亿的数据量,bigint unsign(0 ~18,446,744,073,709,551,615.), 40 亿的数据量对于一个频繁增加删除的表来说并不是一个很大的数字,有用完的风险。因此在建表时需要考虑,是否使用bigint。
优点
- 简单、高效
- 唯一、递增
缺点
- 可拓展性差;所有的id生成都依赖于主库,难以拓展;当然,可以增加主库的数量,将数据水平切分保证每个库的Id不重复,但是会引入格外的复杂度。
每次id生成都会访问数据库,数据库压力大,所以很多系统想要自己生成id。

发号器服务
想要全局唯一的id,就只能访问一个单点服务。但是直接利用数据库,又会导致数据库压力大,而且每次生成id都会有一次远程访问;
我们可以写一个发号器的服务,专门用来生成唯一id;可以优化访问数据库的逻辑,比如 一次访问批量获取10条id到内存,并记录(持久化)最大的id=n+10,下次取号直接重内存中获取;

这样数据库的访问次数就减少了,并且还可以将 发号器服务和业务服务部署在一个pod里(sidecar),避免频繁的远程调用。

缺点
- 增加开发、运维成本
- 仍然存在远程调用,有一定延迟
接下来介绍两种常用的本地唯一id生成的方案
UUID
通过本地算法获取唯一字符串。
优点
- 本地生成,简单、低延迟
- 拓展性好,理论上无上限
缺点
- uuid类型时字符串,一般长度12+,占用空间较大
- uuid无序会导致页空间浪费以及频繁的页分裂,增加了系统开销
页分裂:如果是乱序的写入,每次在中间的某个叶子节点写入数据,后面的数据都需要往后挪。更糟糕的是,如果后挪时某一页记录已满,接着就会页分裂,部分的数据移动到新的页。
所以乱序的插入会导致频繁的页分裂,不仅耗时,还会导致空间利用率变低,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
图片来自 https://segmentfault.com/a/1190000039151324


snowflake
分布式ID生成算法

一个long型的ID,使用其中41bit作为毫秒数,10bit作为机器编号,12bit作为毫秒内序列号。这个算法单机每秒内理论上最多可以生成1000 * (2^12-1) 或 1000 * ((1 << 12)- 1),也就是4096000个ID。
借鉴snowflake的思想,结合各公司的业务逻辑和并发量,可以实现自己的分布式ID生成算法。
优点
- 本地生成id,延迟低
- id整体趋势有序
- 可以根据自己的业务灵活调整
缺点
- 不是全局有序
Reference
https://segmentfault.com/a/1190000039151324
https://blog.csdn.net/weixin_39710991/article/details/113128951
https://changkaixin.cn/2015/12/04/gen-id-way/
https://z.itpub.net/article/detail/F49F834DAD1FDEE011F56A7CD7DA65C6
https://chai2010.cn/advanced-go-programming-book/ch6-cloud/ch6-01-dist-id.htm
相关文章:
微服务全局ID方案汇总
自增id 对于大多数系统来说,使用mysql的自增id当作主键再最合适不过了。在数据库层面就可以获取一个顺序的、唯一的、空间占用少的id。 自增id需要是 int、bigint这些整数类型,uint 支持 40 亿的数据量,bigint unsign(0 &#x…...
深入 Python 网络爬虫开发:从入门到实战
一、为什么需要爬虫? 在数据驱动的时代,网络爬虫是获取公开数据的重要工具。它可以帮助我们: 监控电商价格变化抓取学术文献构建数据分析样本自动化信息收集 二、基础环境搭建 1. 核心库安装 pip install requests beautifulsoup4 lxml …...
【云原生】动态资源分配(DRA)深度洞察报告
1. DRA 的发展与设计灵感 Kubernetes 早期通过 Device Plugin(设备插件)机制支持 GPU、NIC 等特殊硬件,将节点上可用设备数量上报给 kubelet 和调度器。但设备插件模式存在局限:调度器只能根据节点标签等属性粗粒度筛选ÿ…...
【论文笔记】Contrastive Learning for Compact Single Image Dehazing(AECR-Net)
文章目录 问题创新网络主要贡献Autoencoder-like Dehazing NetworkAdaptive Mixup for Feature PreservingDynamic Feature Enhancement1. 可变形卷积的使用2. 扩展感受野3. 减少网格伪影4. 融合空间结构信息 Contrastive Regularization1. 核心思想2. 正样本对和负样本对的构建…...
分布式存储学习——HBase表结构设计
目录 1.4.1 模式创建 1.4.2 Rowkey设计 1.4.3 列族定义 1.4.3.1 可配置的数据块大小 1.4.3.2 数据块缓存 1.4.3.3 布隆过滤器 1.4.3.4 数据压缩 1.4.3.5 单元时间版本 1.4.3.6 生存时间 1.4.4 模式设计实例 1.4.4.1 实例1:动物分类 1.4.4.2 …...
vue项目如何实现条件查询?
目录 1.前端 2.后端 3.mybatis的sql语句 结语 1.前端 说白了就是,无论该参数是否是空字符串,都会传递到后端。(反正不是null就行)。 2.后端 在controller层中,使用RequestParam注解接收名为registerName的参数&…...
使用multiprocessing实现进程间共享内存
在 Python 中,可以使用多种方法来实现几个进程之间的通信。 简单消息传递:使用 multiprocessing.Queue 或 multiprocessing.Pipe。 共享简单数据:使用 multiprocessing.Value 或 multiprocessing.Array。 共享复杂数据:使用 multiprocessing.Manager。 进程间信号控制:使用…...
在Linux中安装Nginx
上传nginx安装包 Nginx的安装包,从官方下载下来的是c语言的源码包,我们需要自己编译安装。具体操作步骤如下: 安装nginx 安装nginx运行时需要的依赖 yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel 解压源码包到当…...
【每日学点HarmonyOS Next知识】状态栏字体、生命周期、自定义对话框屏幕中间、透明度、tab居中
1、HarmonyOS 单页面如何控制状态栏字体颜色? 状态栏字体颜色可通过设置statusBarContentColor修改,参考文档如下: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-window-V5 参考代码: import…...
地基Prompt提示常用方式
思维链(Chain of Thought, CoT) 思维链(Chain of Thought, CoT) 是指让 AI 在回答问题时,像人类一样展示出一步步的推理过程,而不仅仅是直接给出最终答案。这种方法的目的是让答案更清晰、可信&#…...
外贸企业可以申请网络专线吗?
在对外业务不断扩大的情况下,外贸企业对网络的需求愈发迫切。稳定、快速的网络连接不仅是企业开展国际业务的基础,更是提升竞争力的关键。外贸企业是否可以申请网络专线?如何选择适合的外贸网络专线服务?本文将为您详细解答。 网络…...
阿里巴巴发布 R1-Omni:首个基于 RLVR 的全模态大语言模型,用于情感识别
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【 Linux 系统中 /etc/resolv.conf 文件的 DNS 配置】
如何在 Linux 系统中修改 /etc/resolv.conf 文件的 DNS 配置 在 Linux 系统中,/etc/resolv.conf 文件用于配置系统的 DNS 服务器。通过修改该文件,可以指定系统使用的 DNS 解析服务器。本文将详细介绍如何通过命令行和脚本修改 /etc/resolv.conf 文件&a…...
《探秘人工智能与鸿蒙系统集成开发的硬件基石》
在科技飞速发展的当下,人工智能与鸿蒙系统的集成开发开辟了创新的前沿领域。这一融合不仅代表着技术的演进,更预示着智能设备生态的全新变革。而在这场技术盛宴的背后,坚实的硬件配置是确保开发顺利进行的关键,它就像一座大厦的基…...
datax源码分析
文章目录 前言一、加载配置文件二、根据加载的配置文件进行调度三、根据配置文件执行读取写入任务总结 前言 在上一篇文章当中我们已经了解了datax的启动原理,以及datax的最基础的配置,datax底层java启动类的入口及关键参数。 接下来我将进行启动类执行…...
QuickAPI 和 DBAPI 谁更香?SQL生成API工具的硬核对比(一)
最近低代码开发火得不行,尤其是能把数据库秒变API的工具,简直是开发者的救星。今天咱就聊聊两款国内玩家:QuickAPI(麦聪软件搞出来的低代码神器)和 DBAPI(开源社区的硬核作品)。这两货都能靠SQL…...
Git使用(一)--如何在 Windows 上安装 Git:详细步骤指南
如果你想在 Windows 机器上安装 Git,可以按照以下详细指南进行操作。 第一步:下载 Git 可通过官网下载 适用于 Windows 的 Git 最新版本。 如果下载速度较慢,可以通过下面提供的百度网盘 链接下载安装包, https://git-scm.com/d…...
C#-使用VisualStudio编译C#工程
一.创建csproj文件 二.创建源cs文件 三.生成解决方案 四.运行解决方案 五.VisualStudio功能列表 <1.代码格式化: CtrlKD完成代码整体格式化 <2.窗口布局 窗口->重置窗口布局 <3.引用查找&关联 <4.包管理 <5.日志输出级别 工具->选项->项目解决方案…...
Qt常见面试题合集
零、基本概念 什么是信号槽? 信号槽类似于软件设计模式中的观察者模式,(观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。…...
使用 Golang 操作 MySQL
在Go语言中,操作SQL数据库,通常会用到一些第三方库来简化数据库的连接、查询和操作过程。其中原生的 database/sql go-sql-driver/mysql 库更符合sql语句使用习惯。 安装 go get github.com/go-sql-driver/mysql 直接上代码来演示基本的创建ÿ…...
单片机—中断系统
什么是中断系统? 为使得CPU具有对外界紧急事件的实时处理能力而设置的,当CPU正在处理某些事的时候,当外界紧急事件请求,CPU会停止当前的事情,先去处理紧急的事件,处理结束后,在返回处理当前事件…...
vscode编译器的一些使用问题
目录 解决pip不可用问题 检查VSCode的终端配置 解决pip不可用问题 eg: C:\Users\student>pip pip 不是内部或外部命令,也不是可运行的程序或批处理文件。 先找到系统环境变量 高级->环境变量 系统属性->Path 变量名随意,自己后续知道…...
ubuntu 和 RV1126 交叉编译Mosqutiio-1.6.9
最近需要交叉编译mosquitto,遇到一些小问题记录一下。 1.众所周知使用它自带的Makefile编译的时候,只需要在编译前,指定它config.mk中的变量:CFLAGS头文件路径 和 LDFLAGS库文件路径就ok,例子如下: expor…...
Docker 》》Docker Compose 》》network 网络 compose
docker 默认的网络 三种模式 # 列出所有当前主机上或Swarm集群上的网络 docker network ls#查看网络详情 docker network inspect network名称# 清除未使用的docker网络 docker network prune -f# 创建网络 ocker network create -d bridge 网络名称 docker network create –s…...
【SpringMVC】深入解析使用 Postman 和浏览器模拟将单个与多个参数传递到后端的原理和后端接收参数的过程
SpringMVC—请求(Request) 访问不同的路径,就是发送不同的请求;在发送请求时,可能会带一些参数,所以学习Spring的请求,主要是学习如何传递参数到后端以及后端如何接收; 我们主要是使用 浏览器 和 Postman …...
VSTO(C#)Excel开发10:启动和卸载顺序 事件处理 监视变化
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
vue 仿deepseek前端开发一个对话界面
后端:调用deepseek的api,所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…...
UE5以插件的形式加载第三方库
之前在UE中加载第三方库的形式是以静态或者动态链接的形式加载但是不太容易复用。就想着能不能以插件的形式加载第三方库,这样直接把插件打包发行就可以复用了,之前也找过相应的教程但是很难找到比较简单易懂的教程,要么是比较复杂࿰…...
Vue3全局化配置(ConfigProvider)
效果如下图: 在线预览 APIs ConfigProvider 参数说明类型默认值theme主题对象Theme{}abstractboolean是否不存在 DOM 包裹元素truetagstringConfigProvider 被渲染成的元素,abstract 为 true 时有效‘div’ Theme Type 名称说明类型默认值common?全…...
Centos7系统基于docker下载ollama部署Deepseek-r1(GPU版不踩坑)
目录 一、Docker下载安装 二、Ollama安装 三、部署Deepseek-R1 一、Docker下载安装 1、更新源 sudo yum update -y 2、下载依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 3、添加docker远程仓库地址 yum-config-manager --add-repo http://down…...
