2.分布式-算法

目录

一、限流算法有哪些?

1.计数器算法(Counter-Based Algorithm)

2.固定窗口算法(Fixed Window)

3.滑动窗口算法(Sliding Window)

4.令牌桶算法(Token Bucket)

5.漏桶算法(Leaky Bucket)

二、什么是幂等性?

三、Raft算法

1.Raft是什么

2.Raft的工作流程

2.1.Raft算法的角色

2.2.Leader的选举过程

四、分布式锁

1.基于数据库的分布式锁

2.基于缓存的分布式锁(如Redis)

行为说明:

3.基于Zookeeper的分布式锁


一、限流算法有哪些?

分布式限流算法主要用于控制系统的并发请求量,保护系统免受过载影响,确保服务稳定性。以下是一些常见的分布式限流算法:

1.计数器算法(Counter-Based Algorithm)

一种简化的限流方式,通过维护全局或针对特定资源的计数器,在单位时间内只允许一定数量的请求通过。这是一种非常直接的方法,但可能不够精确,且在高并发下可能需要复杂的锁机制来保证计数的准确性。

2.固定窗口算法(Fixed Window)

最简单的限流算法之一,将时间划分为多个固定大小的时间窗口,每个窗口内分配固定的请求数量配额。一旦窗口内的请求超过配额,则后续请求被限制。这种方法简单但存在突刺问题,即在窗口切换时刻可能瞬间允许大量请求通过。

3.滑动窗口算法(Sliding Window)

为了解决固定窗口算法的突刺问题,滑动窗口算法将时间窗口设计为滑动的,可以更精确地统计任意时间跨度内的请求量。它通过维护一系列连续的固定大小窗口来实现,能够平滑地处理请求流量波动。

4.令牌桶算法(Token Bucket)

该算法模拟一个桶,系统按照恒定速率向桶中添加令牌,请求需要消耗令牌才能通过。如果桶满,新加入的令牌会被丢弃;如果没有足够的令牌则请求被拒绝。这种方式可以平滑突发请求,并允许一定程度的突发流量。

实现方案:Guava RateLimiter是谷歌提供的限流,基于令牌桶算法,适用于单实例的系统。

5.漏桶算法(Leaky Bucket)

与令牌桶相反,漏桶算法限制的是流出速率而非流入速率。请求先进入一个“桶”中,然后以恒定速率“漏出”并被处理。当桶满时,新来的请求将被丢弃或拒绝。它保证了输出速率的恒定,适合控制发送速率场景。

算法实现:可以准备一个队列来保存暂时处理不了的请求,然后通过一个线程池定期从队列中获取请求来执行。

二、什么是幂等性?

幂等性(Idempotence)是一个源于数学的概念,后来被广泛应用于计算机科学和分布式系统设计中。在数学上,一个幂等操作是指一个元素在某一操作下作用多次的结果与作用一次的结果相同。换言之,对于一个幂等函数即多次应用该函数结果不变。

在计算机科学及网络通信领域,特别是分布式系统和API设计中,幂等性的含义稍有不同,但核心思想一致。一个操作或一个接口被称为幂等的,如果它能够被重复执行任意次数,而系统状态保持不变,结果也与首次执行时相同。这意味着,即使由于网络延迟、重传或其他因素导致请求被发送多次,幂等操作也不会对系统产生额外的影响,保证了结果的一致性和系统的稳定性。

幂等性的几个关键点包括:

  • 安全性:重复执行不改变系统状态。
  • 可靠性:在网络不稳定导致请求重发时,幂等性保证了服务的正确性。
  • 简化重试逻辑:在需要重试操作时,无需复杂的逻辑来判断操作是否已完成,直接重试即可。
  • 常见场景:读取数据的操作天然幂等,修改或写入操作往往需要特别设计以实现幂等性,例如通过条件更新、事务控制或唯一标识符来避免重复处理。

实现幂等性的策略有:

  • 使用唯一交易号或事务ID,确保同一操作不会被执行多次。
  • 检查前置条件,只有在条件满足时才执行操作。
  • 乐观锁或悲观锁机制,防止并发修改冲突。
  • 记录已处理请求的标识,如利用Redis等缓存系统存储处理状态。
  • 设计补偿机制,对非幂等操作进行结果校验和回滚处理。

三、Raft算法

1.Raft是什么

Raft算法是一种分布式共识算法,设计初衷是为了替代Paxos算法,又名易于理解的一致性算法。算法的过程如同选举一样,参选者需要说服大多数选民(Server)投票给它,一旦选定后就跟随其操作。Paxos和Raft的区别在于选举的具体过程不同。

2.Raft的工作流程

2.1.Raft算法的角色

Raft算法将Server进程分为三种角色:

  • Leader(领导者)
  • Follower(跟随者)
  • Candidate(候选者)

就像一个民主社会,领导者由跟随者投票选出。在大选期间所有跟随者会变成候选者参与竞选,投票选出领导者。领导者开始这届任期(Term),候选者变回跟随者服从领导者的领导。

三类角色的变迁图如下:

2.2.Leader的选举过程

Raf使用心跳(heartbeat)触发Leader选举,Leader向所有Followers周期性发送heartbeat。如果某个Follower在选举超时时间没有收到Leader的heartbeat,就会询问其他Follower在确定Leader离线后发起一次Leader选举。

Follower将其当前的term加1然后转换为Candidate。它首先给自己投票并且给集群中的其他服务器发送RequestVote RPC。结果有以下三种:

  • 赢得了多数(超过1/2)选票,成功当选为Leader;
  • 收到了Leader的消息,表示有其他服务器已经抢先当选了Leader;
  • 没有赢得多数选票,Leader竞选失败,等待选举超时(Election Timeout)后发起下一次选举。

竞选过程中除了term,还有权重,数据同步,网络等其他因素作为竞选条件。

四、分布式锁

分布式锁是分布式系统中用于解决资源竞争和保持数据一致性的关键技术。以下是几种主流的分布式锁解决方案:

1.基于数据库的分布式锁

这种方案通过关系型数据库实现锁机制。一种常见做法是在数据库中创建一个锁表,包含锁的标识、持有者、过期时间等字段。获取锁时,通过插入一条记录尝试获取锁,如果插入成功表示获取锁成功;释放锁则通过删除记录实现。需要注意的是,为防止死锁和提高效率,通常需要实现锁的超时与自动释放机制。

2.基于缓存的分布式锁(如Redis)

SETNX 是 Redis 中的一个命令,全称是 SET if Not eXists,用于设置键的值,当且仅当键不存在。这个命令在分布式系统中非常有用,特别是在实现分布式锁时,因为它提供了一种原子性的方式来避免并发问题。

# key: 键名,用于唯一标识锁。
# value: 要设置的值,通常用于标记锁的持有者或者存放一些元数据,如锁的过期时间等。
SETNX key value

行为说明:

  • 如果 key 已经存在,那么 SETNX 命令不做任何操作,返回 0(false)。
  • 如果 key 不存在,那么 SETNX 命令会将 key 的值设置为 value,并返回 1(true)。

分布式锁中的应用:

在分布式锁场景中,SETNX 常常与一个过期时间 (EXPX) 结合使用,以避免锁因为某些原因(如持有锁的客户端崩溃)无法被正常释放。这样的组合能够实现一个具有自动过期特性的锁,减少死锁的风险。

SETNX my_lock some_unique_value PX 10000

3.基于Zookeeper的分布式锁

ZooKeeper作为一个分布式协调服务,提供了临时有序节点的功能,非常适合实现分布式锁。客户端可以在特定的路径下创建临时有序节点,通过节点的顺序性和临时性来决定锁的拥有者。获取锁时创建节点,判断自己是否为序号最小的节点以确认是否获取锁;释放锁时删除节点。Zookeeper还提供了监听机制,使得等待锁的客户端可以在锁释放时得到通知。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring底层入门(十一)

1、条件装配 在上一篇中,我们介绍了Spring,Spring MVC常见类的自动装配,在源码中可见许多以Conditional...开头的注解: Conditional 注解是Spring 框架提供的一种条件化装配的机制,它可以根据特定的条件来控制 Bean 的…

Redis 的数据库管理

Redis 提供了⼏个⾯向 Redis 数据库的操作,分别是 dbsize、select、flushdb、flushall 命令, 我将介绍这些常见的命令。 切换数据库 select dbIndex许多关系型数据库,例如 MySQL ⽀持在⼀个实例下有多个数据库存在的,MySQL 可以…

SQLZOO:The JOIN operation

数据表:game-gaol-eteam game idmdatestadiumteam1team210018 June 2012National Stadium, WarsawPOLGRE10028 June 2012Stadion Miejski (Wroclaw)RUSCZE100312 June 2012Stadion Miejski (Wroclaw)GRECZE100412 June 2012National Stadium, WarsawPOLRUS... goal …

mapreduce | 自定义Partition分区(案例2)

1.需求 统计每个手机号消费总金额,按照消费金额降序排序,最终联通、电信、移动分别写入不同的文件。 130、131、132(联通) 133(电信) 135、136、137、138、139 (移动) 手机号,消费记…

卡尔曼滤波状态估计

clear all; close all; clc; %% 上面是调用卡尔曼滤波 % 定义状态维数和初始条件 n 3; % 状态维数 q 0.2; % 过程噪声标准差 r 0.15; % 测量噪声标准差 Q q * eye(n); …

基于JAVA的微信小程序二手车交易平台(源码)

博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Redis经典问题:数据并发竞争

大家好,我是小米!今天我们要聊的话题是在大流量系统中常见的一个问题:数据并发竞争。不管是火车票系统还是微博系统,一旦出现数据并发竞争,都可能导致用户体验下降,甚至系统崩溃。那么,我们该如何解决这个问题呢?让我们一起来深入探讨! 数据并发竞争 当我们谈论大流…

LLM - Generate With KV-Cache 图解与实践 By GPT-2

目录 一.引言 二.KV-Cache 图解 1.Attention 计算 2.Generate WithOut KV-Cache 3.Generate With KV-Cache 4.Cache Memory Usage 三.KV-Cache 实践 1.WithOut KV-Cache 2.With KV-Cache 3.Compare Efficiency 四.总结 一.引言 LLM 推理中 KV-Cache 是最常见的优化…

若依-2主1从表(解决了编辑页面的添加按钮失效问题)

1. 3个表的分析(表名里不要加“t_”,会出现问题) 主表:t_qxk 这是试卷表 主表:t_ques_xk 这是题目表 子表:t_quescxk 这是试卷和题目的关系表,即同时是试卷和题目表的子表。 因为一张试卷可…

给centos机器打个样格式化挂载磁盘(新机器)

文章目录 一、先安装lvm2二、观察磁盘三、磁盘分区四、建PV五、建VG六、创建LV七、在LV上创建文件系统八、挂载到/home(1)临时挂载(2)永久挂载 九、最后reboot一下 一、先安装lvm2 yum install lvm2二、观察磁盘 三、磁盘分区 四…

QT 项目打包(为了后期远程实验用)

一、环境准备 1、一个项目工程 二、步骤 1、将编译器设置调整为Release模式 二、对项目重新编译构建 三、可以看到工程目录这个文件夹 打开工程目录文件夹的Release文件夹,我的路径如下 四、新建一个文件夹,将上述路径文件夹下的exe文件复制到新的文…

云相册APP

简介 一款用于云存照片的app,支持批量上传和下载照片。 平台技术 Android客户端:Kotlin 协程 Retrofit Server服务后端:Java SpringBoot 部署云服务器:华为云耀云服务器L实例 下载网址 小鲸鱼相册 Ps: 由于网站域名备案审核…

SQL STRING_SPLIT函数,将指定的分隔符将字符串拆分为子字符串行

文章目录 STRING_SPLIT (Transact-SQL)1、语法2、参数3、样例样例1样例2 STRING_SPLIT (Transact-SQL) STRING_SPLIT 是一个表值函数,它根据指定的分隔符将字符串拆分为子字符串行。 1、语法 STRING_SPLIT ( string , separator [ , enable_ordinal ] ) 2、参数…

ICLR上新 | 强化学习、扩散模型、多模态语言模型,你想了解的前沿方向进展全都有

编者按:欢迎阅读“科研上新”栏目!“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里,你可以快速浏览研究院的亮点资讯,保持对前沿领域的敏锐嗅觉,同时也能找到先进实用的开源工具。 今天的“科研上…

AlphaFold3—转录因子预测(实操)

写在前面 我们上一次已经介绍了如何使用AlphaFold3:最新AlphaFold 3:预测所有生物分子结构、相互作用 AlphaFold3可以做什么? 1.AlphaFold服务器可以对以下生物分子类型进行建模,评价其相互结合: 蛋白质 DNA RNA 生…

计算机网络-DHCPv6基础

前面我们学习了IPv6地址可以通过手动配置、无状态自动配置、DHCPv6配置,这里简单学习下DHCPv6的知识点。 一、DHCPv6概述 DHCPv6 (Dynamic Host Configuration Protocol for IPv6) 是一种网络协议,设计用于IPv6网络环境中自动为网络设备分配必要的配置信…

java -jar提示jar中没有主清单属性(no main manifest attribute)

目录 传送门前言排查原因问题1-》jdk17和jdk8共存导致idea的maven插件识别报错问题2-》pom.xml中mainClass下面的skip属性是罪魁祸首 其他办法(修改jar包) 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品&…

InfiniGate自研网关实现四

13.服务发现组件搭建和注册网关连接 以封装 api-gateway-core 为目的,搭建 SpringBoot Starter 组件,用于服务注册发现的相关内容处理。 这里最大的目的在于搭建起用于封装网关算力服务的 api-gateway-core 系统,提供网关服务注册发现能力。…

Mysql 多表查询,内外连接

内连接: 隐式内连接 使用sql语句直接进行多表查询 select 字段列表 from 表1 , 表2 where 条件 … ; 显式内连接 将‘,’改为 inner join 连接两个表的 on select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 … ; select emp.id, emp.name, …

宝塔安装多个版本的PHP,如何设置默认的PHP版本

如何将默认的PHP版本设置为7.3.32, 创建软链接指向7.3版本,关键命令:ln -sf /www/server/php/73/bin/php /usr/bin/php 然后再查看PHP版本验证一下结果 [rootlocalhost ~]# ln -sf /www/server/php/73/bin/php /usr/bin/php [rootlocalho…