「技术干货」Pontus-用友云限流服务

2023-10-29 11:10

本文主要是介绍「技术干货」Pontus-用友云限流服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在我们讨论系统稳定性的时候,其实核心的关键词就是容量规划,如何做好业务容量与系统性能的评估,是保障系统稳定性的关键。对于系统性能的评估,需要我们具备自动化工具来对系统进行性能压测,探测系统在实际业务场景下的基线数据,这是我们进行系统资源配置的基础,也是在应对流量增长时进行弹性扩容的依据。
在我们做好容量规划的前提下,在实际业务场景下,我们还是不可避免的会面对不确定的系统压力,在面对突发不确定流量的情况下,我们最担心的就是系统的“雪崩”。就像突然爆发的车流让道路交通瘫痪一样,我们的系统在突发流量下,很可能像多米诺骨牌一样,全链路的崩塌。
很多情况下,我们以为我们的系统能够这样:
「技术干货」Pontus-用友云限流服务
但实际上确实这样
「技术干货」Pontus-用友云限流服务
在系统发生雪崩的情况下,我们连基本容量规划的负载都保证不了。如何保障我们的系统能够在复杂多变的业务场景下,能够持续稳定的提供的负载处理能力。这就要求我们按照系统的容量规划,做好系统的限流保护,让超出负载的流量能够快速的failover,将系统无法承载的流量拒之门外,保护我们的系统不会发生雪崩。
如何做限流
在一般的概念中,我们在讨论限流的时候,首先会想到并发的限流,通过限制系统服务调用的并发数来对系统进行保护。这里面其实包含两层概念:线程数和QPS。
线程数是我们系统中实际活跃的处理线程的数目,而QPS是我们系统在一定时间度量范围内的访问速率。一般传统的限流手段是通过对活跃线程数进行控制来进行系统流量的控制。在现今复杂的互联网服务调用体系下,更常用的是QPS进行限制来达到我们系统保护的效果。
考虑我们现今大部分的互联网架构,一般业务系统会由几十甚至上百的微服务构成,一次业务请求的处理,涉及众多的微服务调用。从线程数的角度看,很难去对整体系统的流量做一个衡量。在我们对复杂的业务系统进行性能评估的时候,会使用全链路压测的工具来进行,衡量的目标也是基于系统的QPS.所以使用对QPS进行限制的手段,会更好的对业务系统进行一个负载保护。
在笔者多年稳定性的负责工作中,一般在系统的各个入口处使用QPS作为主要的限流保护手段,线程数限流更多是作为上游系统对下游系统的一种熔断机制来使用,保护上游系统在下游RT变长的情况下,不会被拖垮。
限流的实现
线程数限流
对于线程数的限流,一般通过令牌许可的方式实现,通过预置令牌的数目来控制系统的活跃线程数量,没有获取令牌的线程,快速的失败返回。
「技术干货」Pontus-用友云限流服务
在线程的入口处获取许可令牌,在执行业务逻辑完毕的出口处归还令牌。在实现上一般使用try{……}finally{……}结构实现,在finally中进行令牌的释放。
线程数的限流多数用于简单系统的负载保护,及自我的熔断保护优雅降级,防止依赖的下游服务RT变长的情况下,造成自身系统性能下降。在例如天猫交易系统这种,依赖下游服务(库存、物流、商品、营销等)较多的系统中,一个服务的变慢可能会对处于核心的交易系统造成不良的影响,所以对于在交易系统中,对于依赖的核心服务都是设置一个自我保护的线程数限流值,在下游服务出问题的情况下进行优雅降级。
QPS限流
和线程数不同,QPS限流是对按照一定时间单位内的并发速率来对系统进行限制。QPS与线程数限流相比,最大的好处除了能够按照压测模型的测算进行设置外,在笔者看来,另一个最大的好处就是可以对流量进行削峰,防止流量突刺对系统资源进行穿透影响。
QPS虽然度量单位上是秒,但是一般的实现不会基于秒级进行计数统计来进行限流保护,基于秒级的计数时间窗口过大,不能够消除流量突刺。试想一下在一秒的时间窗口内,流量突发集中在后面10ms,那么在最后的时刻,系统流量会变成我们期望值的100倍,可想而知这个时候对于系统来说是多么可怕的灾难。
「技术干货」Pontus-用友云限流服务
所以在实现上,一般基于时间窗口的分片来进行计数,将整个QPS的计数周期划分为多个时间窗口,将计数值分散在各个时间窗口进行控制和计算,这样能够避免上面提到的流量突刺的出现,能够有效的将流量进行削峰,将流量洪峰削平,放着洪峰对于系统资源的破坏,例如缓存的热点穿透。
在软件的世界里很奇妙,我们会发现很多东西没有银弹,软件的进化过程,就是跟着实际的场景不断的调优。基于时间窗口的QPS限流,虽然能够消除流量突刺的场景,但是不可避免的会造成流量的损耗。试想一下如果流量的分布不均匀,那么在流量少的时间窗口下,没有到达的流量实际是损耗的。
在实际场景中,例如天猫双十一零点高峰,流量实际在每个时间窗口都是处于极度饱和的状态,这个时候简单的窗口分片就能达到很好的限流效果。
在流量分布不均匀的情况下,我们可以实现动态的时间窗口分片,将不饱和的时间窗口流量在不超过系统负荷的情况下累加到下一时间窗口,这样可以降低流量的损耗。
Pontus-用友云限流服务
用友云iuap平台为了保证客户云端系统服务的稳定性,结合微服务平台的建设,推出了稳定服务套件之一的限流服务Pontus,帮助用友云客户构建稳定性的系统防护体系。
Pontus支持QPS和线程限流两种方式,结合用友云微服务治理平台,将限流服务通过中间件统一服务的方式,内置在应用的微服务框架体系中,对微服务接口提供统一的限流一级防护。
采用动态滑动窗口机制,能够对流量峰值进行削峰,并且最大程度的降低流量损耗。触发限流及后端接口响应超时时,自动触发接口降级。
pontus服务与用友云开发者中心无缝集成,包含在用友云中间件统一SDK中,用户应用在开发者中心部署之后,能够自动发现服务接口,并对相应服务接口进行限流配置。
源于电商大促多年实践场景,Pontus能够为云应用提供稳定一致的流量防护,进行流量削峰和系统熔断,为云应用的稳定性保驾护航。

转载于:https://blog.51cto.com/14084875/2334683

这篇关于「技术干货」Pontus-用友云限流服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300239

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后