分布式面试题
目录
分布式id的生成方案有哪些
雪花算法生成的ID由哪些部分组成
分布式锁在项目中有哪些应用场景?
分布式锁有哪些解决方案
Redis做分布式锁用什么命令
Redis做分布式锁,死锁有哪些情况?如何解决
Redis如何做分布式锁
MySQL如何做分布式锁
什么是分布式系统中的幂等
幂等有哪些技术解决方案
分布式微服务项目你是如何设计的编辑
分布式架构下,Session共享有什么方案?
分布式id的生成方案有哪些
UUID,数据库主健自增,Redis自增ID,雪花算法。
| 描述 | 优点 | 缺点 | |
| UUID | UUID是通用唯—标识码的缩写,其目的是让分布式爆统中的所有元素都有唯一的辨识信息,而不需要通过中央控制器来指定唯—标识。 | 1.降低全局节点的压力,使得主键生成速度更快; 3.跨服务器合并数据方便。 | 1.UUID占用16个字符,空间占用较多; 2.不是递增有序的数字,数据写入IO随机性很大,且索引效率下降 |
| 数据库主键自增 | MySQL数据库设置主键且主键自动增长 | 1.INT和BIGINT类型占用空间较小; 2.主键自动增长,IO写入连续性好; 3.数字类型查询速度优于字符串 | 1.并发性能不高,受限于数据库性能; 3.自增:数据和数据量泄露 |
| Redis自增 | Redis计数器,原子性自增 | 使用内存,并发性能好 | 1.数据丢失; 2.自增:数据量泄露 |
| 雪花算法 (snowflake) | 大名鼎鼎的雪花算法,分布式ID的经典解决方案 | 1.不依赖外部组件; 2.性能教好 | 时钟回拨 |
雪花算法生成的ID由哪些部分组成
1.符号位,占用1位。
2.时间戳,占用41位,可以支持69年的时间跨度。
3.机器ID,占用10位。
4.序列号,占用12位。一毫秒可以生成4095个ID。
分布式锁在项目中有哪些应用场景?
使用分布式锁的场景一般需要满足以下场景:
1.系统是一个分布式系统,集群集群,java的锁已经锁不住了。
⒉操作共享资源,比如库里唯一的用户数据。
3.同步访问,即多个进程同时操作共享资源。
分布式锁有哪些解决方案
1.Reids的分布式锁,很多大公司会基于Reidis做扩展开发。setnx key value ex 10s,Redisson.watch dog.
2.基于Zookeeper。临时节点,顺序节点。
3.基于数据库,比如Mysql。主键或唯—索引的唯—性。
Redis做分布式锁用什么命令
SETNX
格式: setnx key value将key的值设为value,当且仅当key不存在。若给定的 key 已经存在,则SETNX不做任何动作,操作失败。
SETNX是『SET if Not eXists』(如果不存在,则SET)的简写。
加锁: set key value nx ex 10s
释放锁:delete key
Redis做分布式锁,死锁有哪些情况?如何解决
情况1∶加锁,没有释放锁。需要加释放锁的操作。比如delete key。
情况2:加锁后,程序还没有执行释放锁,程序挂了。需要用的key的过期机制。
Redis如何做分布式锁
假设有两个服务A、B都希望获得锁,执行过程大致如下:
Step1:服务A为了获得锁,向Redis发起如下命令:SET productld:lock Oxx9p03001NXEX 30000其中,"productld"由自己定义,可以是与本次业务有关的id,"Oxx9p03001"是一串随机值,必须保证全局唯
一,“NX"指的是当且仅当key(也就是案例中的"productld:lock")在Redis中不存在时,返回执行成功,否则执行失败。"EX 30000"指的是在30秒后,key将被自动删除。执行命令后返回成功,表明服务成功的获得了锁。
Step2:服务B为了获得锁,向Redis发起同样的命令:SET productld:lock 0000111 NX EX 30000
由于Redis内已经存在同名key,且并未过期,因此命令执行失败,服务B未能获得锁。服务B进入循环请求状态,比如每隔1秒钟(自行设置)向Redis发送请求,直到执行成功并获得锁。
Step3:服务A的业务代码执行时长超过了30秒,导致key超时,因此Redis自动删除了key。此时服务B再次发送命令执行成功,假设本次请求中设置的value值为0000222。此时需要在服务A中对key进行续期。
Step4:服务A执行完毕,为了释放锁,服务A会主动向Redis发起删除key的请求。注意:在删除key之前,一定要判断服务A持有的value与Redis内存储的value是否一致。比如当前场景下,Redis中的锁早就不是服务A持有的那一把了,而是由服务2创建,如果贸然使用服务A持有的key来删除锁,则会误将服务2的锁释放掉。此外,由于删除锁时涉及到一系列判断逻辑,因此一般使用lua脚本。
MySQL如何做分布式锁
在Mysql中创建一张表,设置一个主键或者UNIQUE KEY这个KEY就是要锁的KEY,所以同一个KEY在mysq|表里只能插入一次了,这样对锁的竞争就交给了数据库,处理同一个KEY数据库保证了只有一个节点能插入成功,其他节点都会插入失败。
DB分布式锁的实现:通过主键id 或者唯一索性的唯一性进行加锁,说白了就是加锁的形式是向一张表中插入一条数据,该条数据的id就是一把分布式锁,例如当一次请求插入了一条id为1的数据,其他想要进行插入数据的并发请求必须等第一次请求执行完成后删除这条id为1的数据才能继续插入,实现了分布式锁的功能。
什么是分布式系统中的幂等
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
例如,“getUsername()和setTrue()"函数就是一个幂等函数.更复杂的操作幂等保证是利用唯一交易号(流水号)实现.我的理解:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。
幂等有哪些技术解决方案
1.查询操作
查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select是天然的幂等操作;
2删除操作
删除操作也是幂等的,删除一次和多次删除都是把数据删除。(注意可能返回结果不一样,删除的数据不存在,返回0,删除的数据多条,返回结果多个。
3.唯一索引
防止新增脏数据。比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建多个资金账户,那么给资金账户表中的用户ID加唯一索引,所以一个用户新增成功一个资金账户记录。要点:唯一索引或唯一组合索引来防止新增数据存在脏数据(当表存在唯一索引,并发时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可。
4.token机制
防止页面重复提交。
业务要求:页面的数据只能被点击提交一次;
发生原因:由于重复点击或者网络重发,或者nginx重发等情况会导致数据被重复提交;
解决办法:集群环境采用token加 redis(redis单线程的,处理需要排队);单JVM环境:采用token 加redis或token 加jvm锁。
处理流程:
1.数据提交前要向服务的申请token,token 放到redis或 jvm内存,token有效时间;
2.提交后后台校验token,同时删除 token,生成新的token返回。
token特点:要申请,一次有效性,可以限流。
注意: redis 要用删除操作来判断token,删除成功代表token校验通过。
5.traceld
操作时唯一的。
分布式微服务项目你是如何设计的

分布式架构下,Session共享有什么方案?
1.不要有session:但是确实在某些场景下,是可以没有session的,其实在很多接口类系统当中
都提倡【API
无状态服务】;也就是每一次的接口访问,都不依赖于session、不依赖于前一次的接口访问,用jwt的token;
2.存入cookie中:将session存储到cookie中,但是缺点也很明显,例如每次请求都得带着session,数据存储在客户端本地,是有风险的;
3.session同步:对个服务器之间同步session,这样可以保证每个服务器上都有全部的session信息,不过当服务器数量比较多的时候,同步是会有延迟甚至同步失败;
4.我们现在的系统会把session放到Redis中存储,虽然架构上变得复杂,并且需要多访问一次Redis,但是这种方案带来的好处也是很大的:实现session共享,可以水平扩展(增加Redis服务器),服务器重启session不丢失(不过也要注意session在Redis中的刷新/失效机制),不仅可以跨服务器session共享,甚至可以跨平台(例如网页端和APP端)进行共享。
5.使用Nginx(或其他复杂均衡软硬件)中的ip绑定策略,同一个ip只能在指定的同一个机器访问
但是这样做风险也比较大,而且也是去了负载均衡的意义;
相关文章:
分布式面试题
目录 分布式id的生成方案有哪些 雪花算法生成的ID由哪些部分组成 分布式锁在项目中有哪些应用场景? 分布式锁有哪些解决方案 Redis做分布式锁用什么命令 Redis做分布式锁,死锁有哪些情况?如何解决 Redis如何做分布式锁 MySQL如何做分布式锁 什么…...
Prophet 处理时间序列数据
Prophet 处理时间序列数据 flyfish 论文地址 https://peerj.com/preprints/3190/ 官网 https://facebook.github.io/prophet/ 源码地址 https://github.com/facebook/prophet hon import pandas as pd from prophet import Prophet df pd.read_csv(https://raw.githubuse…...
一文搞清楚LoRa网关,LoRa网关全知道
欢迎来到东用知识小课堂下面,今天我们用东用科技的OGC300系列LoRa为例,以简单的方式帮助大家了解一下LoRa相关的小知识一、LoRa网关的基本介绍LoRa是semtech公司创建的低功耗局域网无线标准,低功耗一般很难覆盖远距离,远距离一般功…...
医疗保健和智慧城市服务将引领5G物联网采用
Juniper Research预测,到2026年,全球5G物联网连接将达到1.16亿,而2023年仅为1700万。该公司预测,医疗保健部门和智慧城市服务将在未来三年推动这1100%的增长,到2026年占5G物联网设备的60%以上。5G物联网技术的超低延迟…...
promise静态方法及相关练习
promise的静态方法相对简单,这篇文章做个总结,以便漏补缺总结如下:1. Promise.all/Promise.anyPromise.allSettled/Promise.race都是接受数组,数组里面是promise2.. Promise.all 接收的promise数组只要有一个失败那么整个就是失败…...
【Tips】通过背数据了解业务
学习资料:做了三年数据分析,给你的几点建议 1. 通过背数据了解业务 原文: 总结: 方法:每天早上去到公司第一件事情就是先背一遍最新的各种指标。原理: 数据敏感性就是建立在对数据的了解和熟悉上。业务的…...
设备太分散?如何一站式管理边缘 OS、K8s 和应用?
作者简介 张志龙,SUSE 大中华区资深解决方案架构师,CNCF 官方认证的 CKA&CKAD 工程师,深耕以 Kubernetes 为代表的云原生领域,具备丰富的架构设计、业务容器化改造和项目落地实践经验。 据 Gartner 预测,到 2025 年…...
CF1692D The Clock 题解
CF1692D The Clock 题解题目链接字面描述题面翻译题目描述输入输出题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示代码实现题目 链接 https://www.luogu.com.cn/problem/CF1692D 字面描述 题面翻译 题目描述 从一个24小时制的时间点开始,每隔 xx…...
IDEA 30 个好用天花板技巧,敲代码直接接爽到飞。
IDEA 作为Java开发工具的后起之秀,几乎以碾压之势把其他对手甩在了身后,主要原因还是归功于:好用;虽然有点重,但依旧瑕不掩瑜,内置了非常多的功能,大大提高了日常的开发效率,下面汇总…...
关于selenium的等待
目录 隐式等待 显式等待 注意事项 隐式等待 简单来说:在规定的时间范围内,轮询等待元素出现之后就立即结束。 如果在规定的时间范围内,元素仍然没有出现,则会抛出一个异常【NoSuchElementException】,脚本停止运行…...
结构建模设计——Solidworks软件之装配体操作基本总结三(高级配合、机械配合、快捷菜单功能)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…...
【在 Colab 中使用 TensorBoard 绘图】
【在 Colab 中使用 TensorBoard 绘图】进入 Google Drive进入 Colab在深度学习中,使用本机GPU跑可能会比较慢,这里使用 Google Drive Colab 进行训练,运行代码 进入 Google Drive 进入网盘 初次进入需要注册账号。注意科学上网即可。右键…...
React循环DOM时为什么需要添加key
一、React 渲染流程和更新流程 react渲染流程:jsx -> 虚拟dom -> 真实domreact更新流程:props/state改变 -> render函数重新执行 -> 生成新的虚拟dom树 -> 新旧虚拟dom树进行diff -> 计算出差异进行更新 ->更新到真实的dom树 所以…...
Elasticsearch架构篇 - terms aggregation
terms aggregation 即词项分桶聚合。它是 Elasticsearch 最常用的聚合,类同于关系型数据库依据关键字段做 group。 size:返回的词项分桶数量,默认 10。阈值 65535。默认情况下,协调节点向每个分片请求 top size 数量的词项桶&…...
MySQL 的体系结构、引擎与索引
MySQL的引擎与体系结构 体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层 第二层架构主要完成大多数的核心服务功能,如SQL…...
数字IC设计需要学什么?
看到不少同学在网上提问数字IC设计如何入门,在学习过程中面临着各种各样的问题,比如书本知识艰涩难懂,有知识问题难解决,网络资源少,质量参差不齐。那么数字IC设计到底需要学什么呢? 首先来看看数字IC设计…...
五分钟搞懂POM设计模式
今天,我们来聊聊Web UI自动化测试中的POM设计模式。 为什么要用POM设计模式 前期,我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本 线性脚本(以快递100网站登录举栗): import timefrom selenium import …...
面试 | 递归乘法【细节决定成败】
不用[ * ]如何使两数相乘❓一、题目明细二、思路罗列 & 代码解析1、野蛮A * B【不符合题意】2、sizeof【可借鉴】解析3、简易递归【推荐】① 解析(递归展开图)② 时间复杂度分析4、移位<<运算【有挑战性💪】① 思路顺理② 算法图解…...
【Linux】环境变量与进程优先级
文章目录🎪 进程优先级🚀1.孤儿进程🚀2.优先级查看🚀3.优先级修改🎪 环境变量🚀1.常见环境变量🚀2.环境变量获取🚀3.main中的命令行参数🎪 进程优先级 每个进程都有相应…...
RocketMQ5.0.0的Broker主从同步机制
目录 一、主从同步工作原理 1. 主从配置 2. 启动HA 二、主从同步实现机制 1. 从Broker发送连接事件 2. 主Broker接收连接事件 3. 从Broker反馈复制进度 4. ReadSocketService线程读取从Broker复制进度 5. WriteSocketService传输同步消息 6. GroupTransferService线程…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
