【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的保障容量的三大关键方案实现

盘点本年度我们探索服务的保障容量的“三大法宝”方案实现

    • 文章导航
    • 背景介绍
    • 三大法宝
      • 服务“吃不下了”
      • 限流(排队理论)
        • 漏桶和令牌桶
          • 漏桶算法
            • 算法原理
            • 算法漏洞
        • 令牌桶算法(生产者和消费组模式)
        • 并发控制限流
        • 成功案例
      • 熔断和降级
        • 降级的Qos指标
        • 熔断器机制
        • 较为成熟的熔断技术

注意:特此声明:本文章首发文章在掘金:https://juejin.cn/spost/7329722122657890330,未经允许,请勿进行侵权私自转载。**

他强任他强,清风拂山岗。他横任他横,明月照大江。 —九阳真经心法**

文章导航

在这里插入图片描述

背景介绍

尽管经过了上一篇文章 **《【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的低延迟可用性机制方案实现》**有了低延迟的优化保障,消息引擎仍需精心规划其容量。为了提供无与伦比的流畅体验,消息引擎必须实施有效的容量管理策略。

那么,如何在汹涌的流量洪峰面前保持从容不迫?这就需要运用降级、限流和熔断这三大法宝。

三大法宝

正如古语所言,“他强任他强,清风拂山岗;他横任他横,明月照大江

上面的这句话这正是降级、限流和熔断三大法宝的精髓所在。通过合理的运用,我们便能在流量洪峰面前保持从容不迫,为应用提供稳定、高效的消息服务。
在这里插入图片描述
在这三大法宝的运用中,降级尤为关键。在面对突发的流量冲击时,可以通过牺牲一些边缘服务或组件来确保核心服务的稳定运行,从而避免整个系统被击垮。这就像在围棋中丢卒保车,以局部的牺牲换取全局的胜利。

服务“吃不下了”

从架构稳定性的角度来看,即使在资源有限的情况下,所提供的单位时间服务能力也是有限的。一旦超出这个承受能力,可能会导致整个服务的停顿、应用的崩溃,进而将风险传递给服务调用方,甚至可能导致整个系统的服务能力丧失,引发连锁反应。

就像下图中的大胖子一样,他吃了太多的食物,已经达到了极限,最终导致了消化不良。
在这里插入图片描述

限流(排队理论)

根据排队理论,随着请求量的不断增加,具有延迟的服务其平均响应时间也会迅速上升。为了确保服务的SLA(服务级别协议),必须对单位时间的请求量进行控制。这正是限流变得愈发重要的原因,在学术界,限流也被称为Traffic Shaping。

漏桶和令牌桶

这个概念最早起源于网络通讯领域,其中典型的算法包括漏桶(leaky bucket)算法和令牌桶(token bucket)算法。通过合理运用这些算法,可以有效控制单位时间的请求量,从而确保服务的稳定性和可用性。
在这里插入图片描述

漏桶算法

漏桶算法的核心思想是,有一个模拟的“桶”,它具有特定的容量,并持续地以恒定速率“漏水”。这个漏水的速率可以看作是系统能够处理请求的极限能力。同时,上方源源不断地有“水滴”(代表请求)流入桶中,如同下图:
在这里插入图片描述
如果流入桶中的水滴速度过快,超过了漏水的速率,那么桶中的水就会逐渐积累,直至溢出。这种情况就意味着请求过载,系统无法及时处理所有的请求。

算法原理

漏桶算法用于控制单位时间内的请求量,确保系统不会因过多的请求而过载。通过合理地调整漏水的速率,可以有效地管理系统的负载,确保服务的稳定性和可用性。
在这里插入图片描述

算法漏洞

虽然漏桶算法在处理请求过载问题上具有一定的作用,但它也存在明显的局限性和不足之处,主要分为以下三个方向:
在这里插入图片描述

  • 灵活性不足:漏桶算法的速率固定,对于变化的处理需求不够灵活。如果实际请求量超过预设速率,系统无法相应地提高处理能力,可能会导致请求丢失或者服务延迟。
    • 漏桶算法缺乏动态调整的能力。在面对负载变化时,它无法根据实时情况自动调整处理速率。
  • 难以应对突发请求:漏桶算法通过限制请求速率来防止过载,但对于突发请求的处理可能并不理想。
    • 导致短暂时间内的速度无法控制。
  • 无法充分利用系统资源:由于漏桶算法的限制性,系统可能无法充分利用可用资源来处理更多的请求。
    • 当系统资源有剩余时,漏桶算法无法自动提高处理能力。

由于漏桶算法存在明显的局限性和不足,我们决定引入令牌桶算法。令牌桶算法在处理请求过载问题上更加灵活和有效,能够更好地满足系统需求和提高用户体验。

令牌桶算法(生产者和消费组模式)

令牌桶算法的核心思想是,设置一个令牌桶,令牌以恒定速率添加到桶中。桶内令牌的数量存在上限,每个请求需要获取一个令牌才能被处理。当桶内没有令牌可供获取时,意味着系统已经过载,属于一个典型的生产者和消费组模式。
在这里插入图片描述
相比漏桶,令牌桶算法在处理网络流量和请求过载问题时具有更高的灵活性和适应性。

  • 处理突发请求:令牌桶算法能够更好地处理突发请求。由于令牌的生成速率可以根据实际情况进行调整,因此能够更好地应对突发请求,避免因突发流量过大而导致系统过载。
  • 动态流量控制:令牌桶算法能够根据实时流量情况动态调整令牌的生成速率,实现动态流量控制。这使得系统能够更好地适应流量变化,并充分利用系统资源。
  • 可扩展性:令牌桶算法具有较强的可扩展性,可以轻松地应用于大规模分布式系统。通过将流量分配到多个桶中,可以实现流量分流和负载均衡,从而提高系统的可扩展性和可靠性。
  • 优先级处理:令牌桶算法可以与优先级队列结合使用,实现优先级处理。通过为不同优先级的请求分配不同的令牌生成速率,可以更好地满足高优先级请求的需求,提高系统的服务质量。

在生产项目中,可以考虑结合其他算法或策略,如动态调整令牌生成速率、引入优先级队列等,以提高系统的响应能力和服务质量

处理网络流量和请求过载的问题上,无论是漏桶、令牌桶还是它们的变种算法,本质上都是一种速度控制和限流机制。在工程领域,有许多类似的工具和技术,如Guava库中的RateLimiter,Netty框架中的TrafficShaping等,都采用了类似的原理。

并发控制限流

除了速度控制限流,还有一种并发控制限流模式,例如操作系统中的信号量机制以及Java Development Kit (JDK) 中的Semaphore。这些工具和算法的目标都是为了保护系统资源,防止过载,并确保系统的稳定性和可靠性。

在选择合适的限流算法或工具时,需要根据实际应用场景和需求进行权衡。每种算法都有其优点和局限性,适用于不同的场景。深入了解各种算法的原理、特性和适用范围,并根据具体情况进行选择,是实现高效、稳定系统的重要步骤

成功案例

异步解耦、削峰填谷是消息引擎的核心能力,这正是RocketMQ的设计初衷。

在RPC、应用网关、容器等场景中,流控成为不可或缺的一环,而速度控制更是首选。尽管如此,针对特定场景进行必要的流控仍需细致考量。

  • RocketMQ并没有内置如Guava、Netty等现成的流控组件。它采用了一种独特的策略,借鉴了排队理论来处理慢请求。
  • RocketMQ通过滑动窗口机制来进行容错处理。通过逐步缩小窗口的方式,降低从服务端拉取的频率和消息大小,从而减轻对服务端的压力。

在处理高频交易和数据复制等关键场景时,RocketMQ选择了快速失败策略作为其核心机制。此策略的主要目的是预防因应用服务连锁反应导致的资源迅速耗尽,进而可能触发的应用雪崩风险。通过这一策略,RocketMQ不仅成功地降低了服务端的负载压力,还为端到端传输提供了坚实的低延迟保障,从而确保了整体系统运行的稳定性和可靠性。

正是基于这样的背景与需求,我们自然过渡到了下一个重要议题:服务降级。

熔断和降级

熔断和降级是应对系统过载的两种常用策略,它们紧密相连,常常一起使用。

  • 降级是一种策略性措施,旨在确保系统的稳定性和可靠性。它通常采用关闭或下线某些非核心服务的方式来减轻系统负载,从而避免整个系统的过载和崩溃。这种策略遵循了二八原则,即少数关键服务得到优先保障,而其他非核心服务则可以暂时牺牲。

  • 熔断是一种保护机制,当系统负载过高时,会自动熔断高负载的组件,避免整个系统崩溃。

降级的Qos指标

在选择降级目标时,主要依据服务QoS的定义。服务QoS定义了服务的可用性、性能、可靠性等方面的要求,是衡量服务质量的重要指标。
在这里插入图片描述
通过分析服务QoS,可以确定哪些服务是核心服务,哪些服务是非核心服务,从而有针对性地进行降级操作。

降级处理主要来自于两个方面:用户数据的收集和引擎组件的服务QoS设定。

  • 用户数据的收集:可以帮助我们了解系统的实时运行状态和性能表现,从而及时发现潜在的问题和瓶颈。
  • 引擎组件的服务:QoS设定则是基于对各个组件的重要性和影响力的评估,确定哪些组件可以承受一定的降级操作。
熔断器机制

当谈到熔断时,我们不禁会想起经典电力系统中的保险丝。在电路中,当负载过大或发生故障时,电流会不断升高。为了避免电流过高可能对电路中的重要器件造成损坏,甚至引发火灾,保险丝会在电流异常升高到一定程度时自动熔断,切断电流,从而保护电路的安全运行。

在分布式系统中,初始状态下系统各组件运行正常,没有出现任何问题。然而,当面临高并发场景时,系统中的某个关键依赖组件可能会因为过载或故障而阻塞。如果这个阻塞状态没有得到及时处理,很可能会引发连锁反应,导致其他组件也相继出现故障,最终形成雪崩效应,系统整体崩溃。
在这里插入图片描述
很多时候,刚开始可能只是系统出现了局部、小规模的故障,但由于种种原因,故障影响的范围逐渐扩大,最终导致全局性的后果。而这种过载保护机制,就是我们常说的熔断器(Circuit Breaker)。
在这里插入图片描述
为了解决这一问题,Netflix 公司开源了他们的熔断解决方案 Hystrix。Hystrix 作为一个容错管理工具,能够在分布式系统中有效地实施熔断,防止因远程服务调用失败而导致的级联故障。通过熔断机制,系统可以在面临过载或故障时快速响应,降低对其他服务或组件的影响,从而保障系统的稳定性和可靠性。
在这里插入图片描述
为了避免这种情况的发生,我们可以引入Hystrix的熔断机制。Hystrix作为一种容错管理工具,能够在系统过载或故障时快速响应,通过熔断机制将系统隔离,避免对其他组件造成影响。当某个关键依赖组件出现问题时,Hystrix会立即切断与其的连接,使应用快速失败,从而避免因连锁反应而导致的最坏情况发生。

较为成熟的熔断技术

通过引入熔断机制,我们可以有效地控制系统的流量,及时发现并处理问题,确保系统的稳定性和可靠性。

  • Sentinel是阿里巴巴开源的断路器实现,旨在隔离访问远程系统、服务和第三方库的访问点,防止级联故障,从而提高系统的可用性和容错性。它通过添加延迟容忍和容错逻辑来控制这些分布式服务之间的交互。

  • Hystrix是Netflix开源的延迟和容错库,旨在隔离对远程系统、服务和第三方库的访问,以防止级联故障。通过添加延迟容忍和容错逻辑,Hystrix可以帮助控制这些分布式服务之间的交互,并提高系统的总体弹性。

  • Resilience4j是一个轻量级的容错库,专门为Java 8和函数式编程设计。它提供了高阶函数(decorators)来增强任何功能接口、lambda表达式或方法引用,包括断路器、速率限制器、重试或隔板。这使得在任何函数接口、lambda表达式或方法引用上都可以堆叠多个装饰器。

Sentinel、Hystrix和Resilience4j都是用于处理分布式系统中的流量控制、熔断和降级等问题的工具,下面是三种熔断技术的对比介绍:
在这里插入图片描述

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

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

相关文章

计算机设计大赛 推荐系统设计与实现 协同过滤推荐算法

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 推荐系统设计与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1…

IDEA jdk版本切换问题

打开 IntelliJ IDEA 的 Project Structure(快捷键通常是 Ctrl Alt Shift S)。 转到 Project Settings > Modules。 选择相应的模块,然后在 Sources 标签页下,查看 Language level 是否设置为 自己需要的jdk版本语言。 接…

Java开发分析中文 ---- JProfiler 13

JProfiler 13是一款专业的Java应用程序性能分析工具,可以快速诊断和优化Java应用程序的性能问题。它支持多种操作系统和应用服务器,提供实时性能监控、CPU分析、内存分析、线程分析和数据库访问分析等功能。使用JProfiler 13可以深入了解应用程序的性能和…

PyQT5环境搭建与入门操作(超详细图解安装)

PyQt5软件简介 PyQt5官方版是一款专业优秀的编程工具。PyQt5最新版需要配合Python使用,是Qt C跨平台应用程序框架和跨平台解释语言Python的结合,支持Windows、OS X、Linux、iOS和Android平台运行。PyQt5软件可以帮助用户从Qt Designer生成Python代码&am…

C语言“%”运算符是否可以对小数进行运算?

一、问题 “&#xff05;”运算符是否可以对⼩数进⾏运算&#xff1f; 二、解答 “&#xff05;”运算符&#xff0c;称为求余运算符或者模运算符&#xff0c;要求“&#xff05;”两侧都为整型数据&#xff0c;否则将会产⽣错误 #include <stdio.h> int main() {floa…

【性能问题】postman接口测试偶现高延时排查

一、背景 负责的项目&#xff0c;在test环境&#xff0c;postman连续发送两次接口请求&#xff0c;第二次响应时间高达34s&#xff0c;该现象经常出现&#xff0c;影响QA测试执行效率。这种想象持续一段时间了&#xff0c;今天终于忍无可忍&#xff0c;向Dev和SRE发出求助信息…

AI特训一:为什么要学习AI

我们先了解什么是AI AI&#xff08;人工智能&#xff09;是指计算机系统经过学习和推理能够模拟人类智能行为的一种技术。AI利用机器学习、深度学习、自然语言处理等技术&#xff0c;能够分析大量的数据、识别模式、做出决策和预测 AI有哪些强大之处 处理大量数据&#xff1a…

关于 PostgreSQL,你了解多少

背景 最近因工作原因&#xff0c;了解到了阿里的 hologre&#xff0c;它只支持 psql 协议&#xff0c;用起来跟 mysql 会差很多&#xff0c;也很不习惯。所以就好奇&#xff0c;为啥放着mysql不用&#xff0c;却用 psql 什么是 psql psql 是 开源的关系型数据库管理系统 Pos…

关于msvcp140_1.dll丢失的解决方法分析,一键修复msvcp140_1.dll

随着技术的迭代更新&#xff0c;我们对操作系统变得越发依赖。不过&#xff0c;在使用中有时也会遇到技术障碍&#xff0c;诸如遇到 MSVCP140_1.dll 文件不见的情况。本文着重讨论此问题&#xff0c;并展示了若干解决办法&#xff0c;以便教导用户应对及修补MSVCP140_1.dll文件…

拒掉了一个双 985 的面试者

下班路上&#xff0c;和一个大佬聊天&#xff0c;他说今天面试&#xff0c;拒掉了一个双 985 的候选人。 候选人背景很好&#xff0c;本科和硕士都是 985 院校毕业&#xff0c;并且是除了清北浙之外&#xff0c;排名非常靠前的 985院校。 本硕专业都是计算机专业&#xff0c;…

MySQL数据库-理论基础

1.1 什么是数据库 数据&#xff1a; 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 数据库&#xff1a; 存储数据的仓库&#xff0c;是长期存放在计算机内、有组织…

84 C++对象模型探索。数据语义学 - 继承多个类的时的数据布局问题。

此章节分析多继承问题&#xff0c;难点&#xff0c;但是非重点&#xff0c;实际开发中&#xff0c;多继承用的很少&#xff0c;容易被code review&#xff0c;可以不看。 我们要访问一个类对象中的成员 成员的定位是通过如下两个因素决定的&#xff1a;this指针(编译器会自动调…

向日葵企业“云策略”升级 支持Android 被控策略设置

此前&#xff0c;贝锐向日葵推出了适配PC企业客户端的云策略功能&#xff0c;这一功能支持管理平台统一修改设备设置&#xff0c;上万设备实时下发实时生效&#xff0c;很好的解决了当远程控制方案部署后&#xff0c;想要灵活调整配置需要逐台手工操作的痛点&#xff0c;大幅提…

Redis系列-数据结构篇

数据结构 string&#xff08;字符串&#xff09; redis的字符串是动态字符串&#xff0c;类似于ArrayList&#xff0c;采用预分配冗余空间的方式减少内存的频繁分配。 struct SDS<T>{ T capacity; T len; byte flags; byte[] content; } 当字符串比较短时&#xff0c…

跟着pink老师前端入门教程-day14

2.6 main 主体模块制作 HTML&#xff1a; <div class"w"><div class"main"><!-- 焦点图模块 --><div class"focus"><ul><li><img src"./images/banner_bg.png" alt""></li>…

提高 NFS Azure 文件共享性能

本文内容 适用于增加预读大小以提高读取吞吐量Nconnect另请参阅 本文介绍如何提高 NFS Azure 文件共享的性能。 适用于 展开表 文件共享类型SMBNFS标准文件共享 (GPv2)、LRS/ZRS 标准文件共享 (GPv2)、GRS/GZRS 高级文件共享 (FileStorage)、LRS/ZRS 增加预读大…

指针的深入理解(二)

这节主要复习函数指针 函数指针 函数指针的标志就是int (* ) (数据类型)&#xff0c; 是储存函数的地址的指针变量。函数名就是的首地址。我们平常使用的函数名就是函数的地址&#xff1a; 由此可以发现&#xff0c;我们可以通过函数的地址来使用函数。 那么我们就可以知道函…

什么是Vue Vue入门案例

一、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网&#xff1a;Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进&#xff0c;不一定非得把V…

NC开发客户端(前端)连接启动失败can‘t connect to server, please wait

效果图 解决方法 IP地址和端口要对应 1-IP地址中间启动&#xff0c;肯定是这个127.0.0.1 2-端口号&#xff0c;要对应中间件启动在控制台输出的端口 或者是在home目录-》bin-》sysConfig.bat这里面的服务器&#xff0c; 里面可以看到对应启动ip地址和端口

2023年春秋杯网络安全联赛冬季赛_做题记录

可信计算 基于挑战码的双向认证1 可信计算赛题-双向认证挑战模式.docx 使用命令进行SSH登录上去 ssh player8.147.131.156 -p 18341 # 记得加上-p参数指定端口&#xff0c;不然默认的是22端口看见word文档的提示&#xff0c;先尝试一下 直接获得了flag1 web 魔术方…