高并发系统三大利器之限流

root429 2021-02-04 原文


高并发系统三大利器之限流


什么是限流?

限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。

坐地铁上班的同学对于这张图片是不是都不会陌生。
在这里插入图片描述
基本上在上下班的早晚高峰我们就会发现进站的闸机会有一部分是关闭的。为什么地铁站会关闭一部分闸机呢?这就是为了限流。毕竟地铁站就那么大,可容纳的人数也就那么多。如果大家一股脑全部挤进地铁站是不是又会发生踩踏事件什么的。这是生活中的限流。还有我们去景区玩,景区的门票是不是也是固定的,每天就卖那么多张,卖完即止。限流是不是和我们的生活也息息相关。

为什么要限流?

开篇也有说到限流是为了保证系统的稳定运行。假设我们一个系统一小时之最多只能处理10000个请求,但是一小时流量突增10倍,这突增的流量我们如果不进行限制的话,任由它直接进入系统的话,是不是直接会把我们的系统弄瘫痪,就无法对外提供服务了。本人就曾经被这个所坑过,有一次把爬虫开关拦截的开关给关掉了,突然有一大波的爬虫流量进入系统中,我们也没有把这些爬虫请求进行拦截,然后一股脑的全部给转发到下游系统里面去了。下游系统直接就找上门来了,造成他们的服务发生大量的超时。比如地铁早高峰的时候我们如果不对地铁站进行限流的话,大家是不是都会往地铁站挤,然后再往地铁里面挤,挤不上都还要挤。会导致地铁门都关不上,然后地铁就开不走,会导致越来越多的人堵在地铁站。然后最后就会导致整条地铁线都阻塞了。上班就妥妥的迟到了(对于程序员说大多数应该是弹性制的所以也不存在迟到这一说法)。

限流操作有哪些?

拒绝服务

这个是最最简单粗暴的做法了,直接把请求直接拒绝掉。
比如早高峰坐地铁的时候,直接让进入1000个人,剩下多出来的人不让坐地铁了。直接把入站口给关闭了。

服务降级

将系统的所有功能服务进行一个分级,当系统出现问题,需要紧急限流时,可将不是那么重要的功能进行降级处理,停止服务,这样可以释放出更多的资源供给核心功能的去用。
假设有一个功能新用户注册完,要给用户发送多少优惠券。这时候服务降级的话就可以直接把送券服务关掉,让服务快速响应,提高系统处理能力。
应用到早高峰坐地铁的时候比如在人民广场这个大站点,处理不过来了那么多人换乘,我们是不是可以直接地铁一号线在人民广场不停,直接到下一站在停,这时候经过人民广场换乘的人就少了。

延迟处理

把请求全部放入到队列中,真正处理的话,就从队列里面依次去取,这样的话流量比较大的情况可能会导致处理不及时,会有一定的延时。双十一零点我们付款的时候,去查询订单的状态是不是也会有一定的延时,不像在平时付完款订单状态就变成了付款状态。

特权处理

这个模式需要将用户进行分类,通过预设的分类,让系统优先处理需要高保障的用户群体,其它用户群的请求就会延迟处理或者直接不处理。我们去银行办理业务的时候是不是也会经常需要排队,但是是不是经常会VIP用户、什么白金卡用户,直接不需要排队,直接一上来就可以办理业务,还优先处理这些人的业务。是不是特羡慕这些人,哎 羡慕也没办法谁叫人家有钱咧。

限流的实现方式?

计数器方法

这是最简单的限流算法了,系统里面维护一个计数器,来一个请求就加1,请求处理完成就减1,当计数器大于指定的阈值,就拒绝新的请求。是通过全局的总求数于设置的阈值来达到限流的目的。通常应用在池化技术上面比如:数据库连接池、线程池等中应用。这种方式的话限流不是平均速率的。扛不住突增的流量。

漏桶算法

在这里插入图片描述
我们可以看到水是可以持续流入漏桶里面的,底部也是匀速的流出,如果流入的速率大于底部流出的速率,以及漏桶的水超过桶的大小就会发生益出。请求一经过漏桶的过滤,不管你请求有多少,速率有多快,我反正就这么个速度处理。我们平时坐地铁的时候是不是也是这样,不管你乘客有多少,反正就是隔5min发一趟车。那早高峰的时候你5min钟一趟车根本就不够用啊,上班的人太多啊,你需要加快速度处理啊,所以可能早高峰改为3min一趟,动态调整速率。

令牌桶

在这里插入图片描述

看图的话是不是令牌桶和漏桶都差不多,只不过令牌桶新增了一个匀速生产令牌的中间人以恒定的速度往桶里面放令牌,如果令牌的数量超过里桶的限制的话,令牌就会溢出,这时候就直接舍弃多余的令牌。每个请求过来必须拿到桶里面拿到了令牌才允许请求(拿令牌的速度是不限制的,这就意味着如果瞬间有大量的流量请求进来,可以短时间内拿到大量的令牌),拿不到令牌的话直接拒绝。这个令牌桶的思想是不是跟我们java里面的Semaphore 有点类似。Semaphore 是拿信号量,用完了就还回去。但是令牌桶的话,不需要还回去,因为令牌会定时的补充。令牌桶算法我们可以通过Google开源的guava包创建一个令牌桶算法的限流器。

总结

  • 以上粗略的介绍了几种单机的限流思想,大家可以根据这个思想然后去实现各种各样的限流组件。
  • 我们的限流算法每个里面是不是都一个阈值,这个阈值设置为多少是不是比较难。
    阈值设置过大的话,服务可能扛不住,阈值设置小了会把用户请求给误杀,资源没有得到最大的一个利用。
  • 分布式限流的话,以后有机会再讲。

结束

  • 由于自己才疏学浅,难免会有纰漏,假如你发现了错误的地方,还望留言给我指出来,我会对其加以修正。
  • 如果你觉得文章还不错,你的转发、分享、赞赏、点赞、留言就是对我最大的鼓励。
  • 感谢您的阅读,十分欢迎并感谢您的关注。
发表于
2021-02-04 11:37 
java金融 
阅读(0
评论(0
编辑 
收藏

 

版权声明:本文为root429原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/root429/p/14371726.html

高并发系统三大利器之限流的更多相关文章

  1. AQS之ReentrantReadWriteLock写锁

    用法 1.1 定义一个安全的list集合 public class LockDemo { ArrayList& […]...

  2. 浅谈synchronized和volatitle实现线程安全的策略

    什么是线程不安全 我对线程安全的理解就是多个线程同时操作一个共享变量时会产生意料之外的情况,这种情况就是线程不 […]...

  3. 谈谈volatile关键字以及常见的误解

    近期看到C++标准中对volatile关键字的定义,发现和java的volatile关键字完全不一样,C++的 […]...

  4. 多线程基础(一)

    最近读了高洪岩的《Java多线程编程核心技术》一书,打算记录下多线程的基础知识点,也算对本书的一个读后感了。目 […]...

  5. Java内存模型精讲

    1.JAVA 的并发模型 共享内存模型        在共享内存的并发模型里面,线程之间共享程序的公共状态,线 […]...

  6. JNI-从jvm源码分析Thread.interrupt的系统级别线程打断原理

    JNI-从jvm源码分析Thread.interrupt的系统级别线程打断原理 2020-11-15 14:5 […]...

  7. 并发编程(五)——AbstractQueuedSynchronizer 之 ReentrantLock源码分析

    本文将从 ReentrantLock 的公平锁源码出发,分析下 AbstractQueuedSynchroni […]...

  8. 01. 网络编程

    一、网络编程 1. 模型 1.1 OSI七层模型 制定组织 ISO(国际标准化组织) 作用 使网络通信工程的工 […]...

随机推荐

  1. 日月既往,不可复追,暑期实习结束!

    有时候发现自己咬着牙,已经走了很长的路 在从上海回南京的高铁上码下了这篇文章,心中感慨万千,两个月弹指一挥间, […]...

  2. 阿里云主机上安装jdk

    今天继续安装jdk到阿里云服务上,大家要看一下阿里云是32位还是64位的,如果是32位下载32位的包,如果是6 […]...

  3. WCF入门三[WCF宿主]

    一、概述   WCF程序必须在宿主上运行,也就是WCF服务必须寄宿在某一个windows的进程中,可以是IIS […]...

  4. 史上最小 x86 Linux 模拟器「GitHub 热点速览 v.22.50」

    本周 GitHub Trending 略显冷清,大概是国内的人们开始在养病,而国外的人们开始过圣诞、元旦双节。热度不减的 ChatGPT 依旧占据了本周大半的 GitHub 热点项目,不过本周的特推和周榜并未重复收录这些。不过,本周有个新的...

  5. Java Web之网上购物系统(提交订单、查看我的订单) – kang_ya_ping

    Java Web之网上购物系统(提交订单、查看我的订单) 作业终于做完了,好开心。。。。。。虽然这一周经历不是 […]...

  6. 推荐使用并手写实现redux-actions原理

    @ 目录 一、前言 二、介绍 2.1 创建action 2.2 reducer 2.3 触发action 三、 […]...

  7. leetcode题库

    leetcode 分类题库 动态规划法适用场景:当前结果与上一个结果相关联 1.整数拆分:将一个整数拆分为至少 […]...

  8. 文本挖掘的基本过程

    众所周知,由于缺乏意识和缺乏技术的能力,很多组织的数据都在睡大觉。数据包含这关于客户、伙伴和竞争对手的相关信息 […]...

展开目录

目录导航