2.分布式-算法

news2025/1/13 7:25:50

目录

一、限流算法有哪些?

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.coloradmin.cn/o/1668938.html

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

相关文章

PyQt5中的QtDesigner窗口

文章目录 1. 简介2. QtDesigner的MainWindow2.1 创建MainWindow2.2 添加组件2.3 预览2.4 查看对应的Python代码2.5 保存窗口并命名为login.ui,如下所示2.6对ui文件进行转换得到.py原件 3. 窗口常用属性及说明3.1 设置对象名称3.2 改变标题名字3.3 修改窗口大小 4. 更…

pdf 版面分析与优化策略

1. 简介 版面分析作为RAG的第一步工作,其效果对于下游工作至关重要。 前常见的 PDF 解析方法包括三种 基于规则:根据 PDF 的组织特征确定每个部分的规则(风格和内容)缺点:不通用(PDF格式不固定&#xf…

DSA理解理解蓝桥杯例题signature

一、历史 1991年8月,NIST(Nation Institute of Standards and Technology,美国国家标准技术研究所)提出了数字签名算法(DSA)用于他们的数字签名标准(DSS)中。 DSA是算法&#xff0c…

C++的数据结构(四):队列

在数据结构中,队列(Queue)是一种特殊的线性表,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列中没有元素时,称为空队列。队列的…

python数据分析——matplotlib可视化基础

参考资料:活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt # 导入数据 anscombepd.read_csv(r"...\seaborn常用数据案例\anscombe.csv") anscombe.head() 大多数基本图表的名字以plt.plot开头。 # 创建数据子集 # 只包含数…

消息中间件Kafka(PHP版本)

小编最近需要用到消息中间件,有需要要复习一下以前的东西,有需要的自取,强调一点,如果真的想了解透彻,一定要动手,脑袋会了不代表就会写了 Kafka是由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅…

py黑帽子学习笔记_环境准备

1 下载os装os 下载一个kali虚机镜像然后用虚机管理软件创虚机,装完如下图,我用的版本是2024.1的版本kali-linux-2024.1-installer-amd64,可以从镜像站下载,官网下的慢还断网Index of /kali-images/kali-2024.1/ | 清华大学开源软…

AI 问答 API 对接说明

我们知道,市面上一些问答 API 的对接还是相对没那么容易的,比如说 OpenAI 的 Chat Completions API,它有一个 messages 字段,如果要完成连续对话,需要我们把所有的上下文历史全部传递,同时还需要处理 Token…

47岁古天乐唯一承认女友约「御用阿妈」过母亲节

日前关宝慧在IG晒出一张聚会照,并写道:「预祝各位#母亲节快乐🌹#dinner #happy #friends #好味」相中所见,前TVB金牌监制潘嘉德、卢宛茵、黄𨥈莹、黎萨达姆都有出席饭局。 当中黄𨥈莹身穿卡其色西装褛&…

【35分钟掌握金融风控策略24】定额策略实战

目录 基于客户风险评级的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于客户风险评级的定额策略 在开发定额策略时,精准确定客户的基础额度是一个关键步骤,通常会基于客户的收…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境,新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例

介绍 本示例主要介绍了利用position和onTouch来实现首页下拉进入二楼、二楼上划进入首页的效果场景,利用translate和opacity实现动效的移动和缩放,并将界面沉浸式(全屏)显示。 效果图预览 使用说明 向下滑动首页页面超过触发距…

【Linux】centos7安装软件(rpm、yum、编译安装),补充:查找命令的相关文件路径,yum安装mysql

【Linux】技术上,Linux是内核。而术语上,我们通常说的Linux是完整的操作系统,其实称为"Linux发行版",是将Linux内核和应用系统打包,由不同的发行家族发行了不同版本。Linux发行版众多,主要有RedH…

HCIP-Datacom-ARST自选题库_07_割接【35道题】

一、单选题 1.在割接的测试阶段,符合以下哪一种情况的可以判断为割接成功? 网络承载的上层应用业务测试正常 网络设备的配置查看结果正常 网络流量路径正常 路由协议运行正常 2.在割接的测试阶段中,表明已经完成测试的标准是: IP设备的配置查看结…

org.postgresql.util.PSQLException: 错误: 关系 “dual“ 不存在

springboot 项目连接 postgreps,启动时报错 org.postgresql.util.PSQLException: 错误: 关系 "dual" 不存在。 查阅资料后发现这是由配置文件中的配置 datasource-dynamic-druid-validationQuery 导致的 spring:datasource:druid:stat-view-servlet:ena…

二叉树介绍

引入 定义 区别 定义不同 形态不同 基本形态

Ubuntu18.04解决有线网卡连接问题(不更新内核成功版)

https://www.realtek.com/Download/List?cate_id584 (需要翻一下) 不想自己去下载,直接去我资源里下载我上传的包就好啦(😂😂😂刚刚看了下别人下载要VIP还是自己去网站下很快的) 下载后解压,在…

FreeRTOS二值信号量

目录 一、信号量的概念 1、信号量的基本概念 2、信号量的分类 二、二值信号量简介 三、二值信号量相关API 1、创建二值信号量 2、释放二值信号量 3、获取二值信号量 四、二值信号量实操 1、实验需求 2、CubeMX配置 3、代码实现 一、信号量的概念 1、信号量的基本概…

从零开始的软件测试学习之旅(七)接口测试流程及原则案例

接口测试三要素及案例 接口测试介绍接口预定义接口测试的主要作用测试接口流程如下接口测试三要素接口测试分类RESTful架构风格RESTful架构三要素要素一要素二要素三 RESTful架构风格实现restful架构案例接口测试流程接口测试原则功能测试自动化测性能测试 复习复盘 接口测试介…

MYSQL:MySQL 事务隔离级别详解

一、MySQL事务是什么? MySQL事务是一组在数据库中执行的操作,这些操作要么全部成功执行,要么全部不执行,以确保数据库的完整性和一致性。 事务的 ACID 事务具有四个特征:原子性( Atomicity )、…