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.mzph.cn/news/836614.shtml

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

相关文章

生产设备数据管控要怎么做 可以实现精益生产和智能制造?

生产设备在制造过程中会产生多种类型的数据,这些数据对于优化生产流程、提高效率、降低成本和预防性维护等方面至关重要。需要对这些数据进行有效的采集和管理,以实现对生产设备数据管控。 一、生产设备数据类型包括: 设备运行状态数据&…

C++八股(面试题、手撕题)自用版

目录 面试题: 1. define inline 在编译的哪个阶段 2. const static 3. 子函数返回结构体有什么问题,返回对象调用了哪些函数 4. volatile关键字 5. 编译器基本原理 6. 预处理、编译、汇编、链接以及他们在操作系统上如何运作的 7. 数组和指针&a…

第十一届蓝桥杯大赛软件类决赛 Java 研究生组

文章目录 发现宝藏【考生须知】试题 A: 合数个数试题 B: 含 2 天数试题 C 阶乘约数试题 D: 本质上升序列试题 E: 迨尺天涯试题 F 循环小数试题 G: 蓝肽子序列试题 H 出租车试题 I: 答疑试题 J: 蓝跳跳 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&a…

【高阶数据结构(三)】图的遍历最小生成树问题

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 高阶数据结构 1. 前言2. 图的遍…

成功案例(IF=7.4)| 脂代谢组学和蛋白质组学分析揭示多囊卵巢综合征的发病机制

研究背景 多囊卵巢综合征(PCOS)是女性最常见的内分泌和代谢紊乱,也是无排卵性不孕症和高雄激素血症的主要原因。患者的主要临床表现为月经少、不孕、高雄激素血症、肥胖、多毛、痤疮、胰岛素抵抗(IR)和B超下多囊卵巢改…

Electron学习笔记(六)

文章目录 相关笔记笔记说明 七、系统5、托盘图标(1)、设置托盘图标(2)、托盘图标闪烁(3)、托盘图标菜单 6、剪切板(1)、写入剪切板(2)、读取剪切板 7、系统通知8、其他(1)、使用系统默认应用打开文件(2)、接收拖拽到窗口中的文件(3)、使用系统字体 相关笔记 Electron学习笔记&…

具身智能论文(二)

目录 1. Code as Policies: Language Model Programs for Embodied Control2. Embodied Agents for Efficient Exploration and Smart Scene Description3. Embodied Agents for Efficient Exploration and Smart Scene Description4. Learning to explore informative traject…

Stateflow基础知识笔记

01--Simulink/Stateflow概述 Stateflow是集成于Simulink中的图形化设计与开发工具,主要 用于针对控制系统中的复杂控制逻辑进行建模与仿真,或者说, Stateflow适用于针对事件响应系统进行建模与仿真。 Stateflow必须与Simulink联合使用&#…

第七届世界通信工程研讨会(WSCE 2024)即将召开!

第七届世界通信工程研讨会(WSCE 2024)将于2024年9月27-29日在日本东京举行。WSCE 的成立旨在应对通信工程领域所面临的挑战和机遇,尽管该领域已趋于饱和,但其仍保持着强劲的发展势头。本次研讨会旨在加速通信创新并加强该领域专家…

编程技巧:什么是JavaScript递归

什么是递归 程序调用自身的编程技巧称为递归(recursion) 递归的基本思想是将一个复杂的问题分解成更小、更易于管理的子问题,这些子问题与原始问题相似,但规模更小。 递归的要素 基本情况(Base Case)&…

Python 编程语言中的 None 到底是什么?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 让我们一起深入了解 Python 中的 None。 什么是 None? 在 Python 编程语言中,None 是一个特殊的常量,它代表了 “无” 或 “没有值”。你可以把它想象成一个空盒子…

Debian常用命令:高效管理与运维的必备指南

在Linux世界中,Debian以其稳定性、安全性和开源精神赢得了广大用户的青睐。作为一个基于Linux的操作系统,Debian拥有丰富且强大的命令行工具,这些命令对于系统管理员和开发者来说至关重要。本文将为您介绍一系列Debian系统中的常用命令&#…

python 自定义包的实现

1. 代码目录 创建自定义包的时候,原理是当 python 检测到一个目录下存在 __init__.py 文件时,python 就会把它当成一个模块(module)。 下面这个例子是网上整理的代码,但是有些小改动,可以直接拿来就用。 看代码结构:…

flink尚硅谷

flink 1 flink基础使用1.1 角色1.2 部署模式(抽象)1.2.1 会话模式1.2.2 单作业模式1.2.3 应用模式 1.3 运行模式(实际 谁来管理资源)1.3.1 Stand alone1.3.2 YARN运行模式(重点) 2. 运行时架构2.1 系统架构…

【Java EE】网络原理——TCP1

目录 1.TCP协议格式 2.TCP协议的特点 3.TCP协议的核心机制(十个) 3.1确认应答机制 3.2超时重传 3.3连接管理 3.3.1三次握手基本流程: 3.3.2三次握手的意义或者解决的问题:(面试题) 3.3.3三次握手时…

什么是无人直播?无人直播软件带你探索全新的赚钱模式!

在当今数字化时代,AI技术的迅猛发展正引领着各行各业的深刻变革。其中,AI实景自动无人直播软件以其独特的优势,正成为商家们提升品牌形象、扩大市场影响力的重要工具。本文将详细介绍这款软件的功能特点及其在商业领域的应用价值。全网最新智…

RabbitMQ中间件安装

消息队列 RabbitMQ yum -y update yum -y install epel-release erlang # 安装erlang erl -version # 判断是否安装成功根据官网的的表格判断自己用哪个版本的 RabbitMQ:https://www.rabbitmq.com/docs/which-erlang#r16b03 [rootiZuf6hqrs5cb2ccyuc9nqvZ ~]# er…

【C++历练之路】unordered_map与unordered_set的封装实现

W...Y的主页 😊 代码仓库分享💕 前言:我们已经认识并实现了哈希底层的逻辑,创建出了其开散列。现在我们要进行封装,类比STL中的unordered_set 与 unordered_map。 目录 1. 模拟实现 1.1 哈希表的改造 1.2 unorde…

uabntu pcl spdlog安装位置和版本查看那

查看pcl默认安装版本 pkg-config --modversion pcl_io 查看pcl路径 pkg-config --libs pcl_io

企业计算机服务器中了rmallox勒索病毒怎么破解,rmallox勒索病毒解密工具步骤

科技技术的发展,为企业的生产运营注入了新的活力,越来越多的企业利用网络走向了数字化办公模式,网络也极大地方便了企业的生产运营,大大提高了企业的生产效率,加快了企业发展的步伐。但是网络数据安全问题一直是企业关…