码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【微服务架构】分布式限流策略


    文章目录

    • 限流方式
      • 集中式(全局)限流
      • 进程内限流
        • 单机限流
        • 依赖配置中心
        • go-zero基于redis设计的两款分布式限流器
    • kubernetes怎么实现分布式限流
      • istio
      • ingress rate limiting
      • k8s获取pod副本数做限流

    限流方式

    集中式(全局)限流

    网关层限流服务网关,作为整个分布式链路中的第一道关卡,承接了所有用户来访请求。我们在网关层进行限流,就可以达到了整体限流的目的了。

    目前,主流的网关层有以软件为代表的Nginx,还有Spring Cloud中的Gateway和Zuul这类网关层组件,也有以硬件为代表的F5。

    进程内限流

    单机限流

    漏斗桶,令牌桶等算法限流

    依赖配置中心

    如果有注册中心(consul、nacos、etcd),可以实时获取注册中心节点数
    如果服务的节点动态调整,单个服务的qps也能动态调整。

    go-zero基于redis设计的两款分布式限流器

    https://github.com/zeromicro/go-zero/tree/master/core/limit

    优点:设计、实现简单,拿来即用
    缺点:qps较高,redis内存消耗严重

    其中,ping redis大概6-7ms左右,对应的,每次请求需要访问redis,时延都有大概6-7ms,性能下降明显

    对于极致追求高性能的服务不需要考虑熔断、降级来说,是需要尽量减少网络之间的IO

    kubernetes怎么实现分布式限流

    istio

    https://cloud.tencent.com/developer/article/1468273

    ingress rate limiting

    在这里插入图片描述

    https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rate-limiting

    k8s获取pod副本数做限流

    在实际的服务中,数据上报服务一般无法确定客户端的上报时间、上报量,特别是对于这种要求高性能,服务一般都会用到HPA来实现动态扩缩容,所以,需要去间隔一段时间去获取服务的副本数。

    import (
    	"context"
    	"github.com/why19970628/k8s-cheatsheet/models"
    	"github.com/why19970628/k8s-cheatsheet/utils"
    	corev1 "k8s.io/api/core/v1"
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    	"k8s.io/client-go/kubernetes"
    	"log"
    	"strings"
    )
    
    func CountDeploymentSize(c kubernetes.Interface, namespace string, deploymentName string) *int32 {
    	deployment, err := c.AppsV1().Deployments(namespace).Get(context.TODO(), deploymentName, metav1.GetOptions{})
    	utils.HandlerCheck(err)
    	return deployment.Spec.Replicas
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 对于保证qps限频准确的时候,应该怎么解决呢?
      在k8s中,服务是动态扩缩容的,相应的,每个节点应该都要有所变化,如果对外宣称限频100qps,而且后续业务方真的要求百分百准确,只能把LoadingCache的过期时间调小一点,让它能够近实时的更新单节点的qps。这里还需要考虑一下k8s的压力,因为每次都要获取副本数,这里也是需要做缓存的

    • 服务从1个节点动态扩为4个节点,这个时候新节点识别为4,但其实有些并没有启动完,会不会造成某个节点承受了太大的压力
      理论上是存在这个可能的,这个时候需要考虑一下初始的副本数的,扩缩容不能一蹴而就,一下子从1变为4变为几十个这种。一般的话,生产环境肯定是不能只有一个节点,并且要考虑扩缩容的话,至于要有多个副本预备的

    • 如果有多个副本,怎么保证请求是均匀的
      这个是依赖于k8s的service负载均衡策略的,流量是能够均匀的落到节点上的。整个限流都是基于k8s的,如果k8s出现问题,那就是整个集群所有服务都有可能出现问题了。

  • 相关阅读:
    项目练习:房屋出租系统
    2023年中职“网络安全“—JavaScript安全绕过
    Linux基础-网络配置
    KTV如何创新?VR全景打造KTV趣味互动新体验
    使用不同尺寸的传感器拍照时,怎么保证拍出同样视场范围的照片?
    【NI-DAQmx入门】NI-DAQmx之C、C++、VB、VB.net与C#支持
    23王道考研操作系统目录一览
    markdown工具Atom预览与插件安装
    python的学习笔记
    【RTOS训练营】任务调度(续)、任务礼让、调度总结、队列和晚课提问
  • 原文地址:https://blog.csdn.net/weixin_43746433/article/details/126121672
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号