返回顶部
首页 > 资讯 > 精选 >React SSR中的限流怎么实现
  • 679
分享到

React SSR中的限流怎么实现

2023-07-02 16:07:29 679人浏览 泡泡鱼
摘要

这篇文章主要介绍“React SSR中的限流怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React SSR中的限流怎么实现”文章能帮助大家解决问题。为什么要限流如下所示

这篇文章主要介绍“React SSR中的限流怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React SSR中的限流怎么实现”文章能帮助大家解决问题。

为什么要限流

如下所示是一个简单的 nodejs 服务端项目

const express = require('express')const app = express()app.get('/', async (req, res) => {  // 模拟 SSR 会大量的占用内存  const buf = Buffer.alloc(1024 * 1024 * 200, 'a')  console.log(buf)  res.end('end')})app.get('/another', async (req, res) => {  res.end('another api')})const listener = app.listen(process.env.PORT || 2048, () => {  console.log('Your app is listening on port ' + listener.address().port)})

其中,我们通过 Buffer 来模拟 SSR 过程会大量的占用内存的情况。

然后,通过 Docker build -t ssr . 指定将我们的项目打包成一个镜像,并通过以下命令运行一个容器

docker run \-it \-m 512m \ # 限制容器的内存--rm \-p 2048:2048 \--name ssr \--oom-kill-disable \ssr

我们将容器内存限制在 512m,并通过 --oom-kill-disable 指定容器内存不足时不关闭容器。

接下来,我们通过 autocannon 来进行一下压测:

autocannon -c 10 -d 1000 Http://localhost:2048

通过, docker stats 可以看到容器的运行情况:

CONTaiNER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O         PIDSd9c0189e2b56    ssr     0.00%     512MiB / 512MiB     99.99%    14.6kB / 8.65kB   41.9MB / 2.81MB   40

此时,容器内存已经全部被占用,服务对外失去了响应,通过 curl -m 5 http://localhost:2048 访问,收到了超时的错误提示:

curl: (28) Operation timed out after 5001 milliseconds with 0 bytes received

我们改造一下代码,使用 counter.js 来统计 QPS,并限制为 2:

const express = require('express')const counter = require('./counter.js')const app = express()const limit = 2let cnt = counter()app.get(  '/',  (req, res, next) => {    cnt(1)    if (cnt() > limit) {      res.writeHead(500, {        'content-type': 'text/pain',      })      res.end('exceed limit')      return    }    next()  },  async (req, res) => {    const buf = Buffer.alloc(1024 * 1024 * 200, 'a')    console.log(buf)    res.end('end')  })app.get('/another', async (req, res) => {  res.end('another api')})const listener = app.listen(process.env.PORT || 2048, () => {  console.log('Your app is listening on port ' + listener.address().port)})// counter.jsmodule.exports = function counter(interval = 1000) {  let arr = []  return function cnt(number) {    const now = Date.now()    if (number > 0) {      arr.push({        time: now,        value: number,      })      const newArr = []      // 删除超出一秒的数据      for (let i = 0, len = arr.length; i < len; i++) {        if (now - arr[i].time > interval) continue        newArr.push(arr[i])      }      arr = newArr      return    }    // 计算前一秒的数据和    let sum = 0    for (let i = arr.length - 1; i >= 0; i--) {      const {time, value} = arr[i]      if (now - time <= interval) {        sum += value        continue      }      break    }    return sum  }}

此时,容器运行正常:

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O        PIDS3bd5aa07a3a7   ssr     88.29%    203.1MiB / 512MiB   39.67%    24.5MB / 48.6MB   122MB / 2.81MB   40

虽然此时访问 / 路由会收到错误:

curl -m 5  http://localhost:2048exceed limit

但是 /another 却不受影响:

curl -m 5  http://localhost:2048/anotheranother api

由此可见,限流确实是系统进行自我保护的一个比较好的方法。

令牌桶算法

常见的限流算法有“滑动窗口算法”、“令牌桶算法”,我们这里讨论 “令牌桶算法” 。在令牌桶算法中,存在一个桶,容量为 burst 。该算法以一定的速率(设为 rate )往桶中放入令牌,超过桶容量会丢弃。每次请求需要先获取到桶中的令牌才能继续执行,否则拒绝。

根据令牌桶的定义,我们实现令牌桶算法如下:

export default class TokenBucket {  private burst: number  private rate: number  private lastFilled: number  private tokens: number  constructor(burst: number, rate: number) {    this.burst = burst    this.rate = rate    this.lastFilled = Date.now()    this.tokens = burst  }  setBurst(burst: number) {    this.burst = burst    return this  }  setRate(rate: number) {    this.rate = rate    return this  }  take() {    this.refill()    if (this.tokens > 0) {      this.tokens -= 1      return true    }    return false  }  refill() {    const now = Date.now()    const elapse = now - this.lastFilled    this.tokens = Math.min(this.burst, this.tokens + elapse * (this.rate / 1000))    this.lastFilled = now  }}

然后,按照如下方式使用:

const tokenBucket = new TokenBucket(5, 10)if (tokenBucket.take()) {  // Do something} else {  // refuse}

简单解释一下这个算法,调用 take 时,会先执行 refill 先往桶中进行填充。填充的方式也很简单,首先计算出与上次填充的时间间隔 elapse 毫秒,然后计算出这段时间内应该补充的令牌数,因为令牌补充速率是 rate 个/秒,所以需要补充的令牌数为:

elapse * (this.rate / 1000)

又因为令牌数不能超过桶的容量,所以补充后桶中的令牌数为:

Math.min(this.burst, this.tokens + elapse * (this.rate / 1000))

注意,这个令牌数是可以为小数的。

令牌桶算法具有以下两个特点:

  • 当外部请求的 QPS M 大于令牌补充的速率 rate 时,长期来看,最终有效的 QPS 会趋向于 rate 。这个很好理解,拉的总不可能比吃的多吧。

  • 因为令牌桶可以存下 burst 个令牌,所以可以允许短时间的激增流量,持续的时间为:

T = burst / (M - rate) // rate < M

可以理解为一个水池里面有 burst 的水量,进水的速率为 rate ,出水的速率为 M ,则净出水速率为 M-rate ,则水池中的水放空的时间即为激增流量的持续时间。

关于“React SSR中的限流怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: React SSR中的限流怎么实现

本文链接: https://lsjlt.com/news/342926.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • React SSR中的限流怎么实现
    这篇文章主要介绍“React SSR中的限流怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React SSR中的限流怎么实现”文章能帮助大家解决问题。为什么要限流如下所示...
    99+
    2023-07-02
  • React SSR 中的限流案例详解
    目录为什么要限流令牌桶算法当对 React 应用进行页面加载或 SEO 优化时,我们一般绕不开 React SSR。但 React SSR 毕竟涉及到了服务端,有很多服务端特有的问题...
    99+
    2024-04-02
  • Redis限流怎么实现
    这篇文章给大家分享的是有关Redis限流怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。面对越来越多的高并发场景,限流显示的尤为重要。当然,限流有许多种实现的方式,Redi...
    99+
    2024-04-02
  • php怎么实现限流
    这篇文章给大家分享的是有关php怎么实现限流的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   什么是接口限流   那么什么是限流呢?顾名思义,限流就是限制流量,包括并发的流...
    99+
    2024-04-02
  • react中ssr项目指的是什么
    这篇文章主要介绍“react中ssr项目指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react中ssr项目指的是什么”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • ASP.NET Core中间件怎么实现限流
    本篇内容介绍了“ASP.NET Core中间件怎么实现限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、限流算法在高并发系统中...
    99+
    2023-06-29
  • SpringBoot项目中怎么实现接口限流
    这篇文章将为大家详细讲解有关SpringBoot项目中怎么实现接口限流,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。限流算法一般有漏桶算法和令牌桶算法及计数...
    99+
    2024-04-02
  • Java限流功能怎么实现?
     在Java中,限流是一种常见的技术手段,用于控制系统的访问速率,以保护系统免受过载和滥用。以下是一些常见的Java限流实现方法:   1.计数器限流   这是一种简单而常见的限流方法。在该方法中,我们可以使用计数器来记录每个时间窗口内的请...
    99+
    2023-09-24
    算法
  • Python怎么实现简易的限流器
    今天小编给大家分享一下Python怎么实现简易的限流器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。简单总结就是:动态的re...
    99+
    2023-06-29
  • kubernetes怎么实现分布式限流
    本篇内容主要讲解“kubernetes怎么实现分布式限流”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“kubernetes怎么实现分布式限流”吧!一、概念限流(Ratelimiting)指对应用...
    99+
    2023-06-29
  • PHP怎么实现令牌桶限流
    小编给大家分享一下PHP怎么实现令牌桶限流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP实现令牌桶限流的方法:1、设有一个令牌桶,桶内存放令牌;2、每次访问...
    99+
    2023-06-25
  • Redis怎么实现限流和熔断
    Redis 可以通过以下方式实现限流和熔断: 限流:使用 Redis 的计数器功能来实现限流。在每次请求到来时,首先检查计数器的...
    99+
    2024-05-07
    Redis
  • Java常见的限流算法怎么实现
    这篇“Java常见的限流算法怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java常见的限流算法怎么实现”文章吧。为...
    99+
    2023-06-29
  • Golang怎么实现常见的限流算法
    本篇内容介绍了“Golang怎么实现常见的限流算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!固定窗口每开启一个新的窗口,在窗口时间大小内...
    99+
    2023-07-05
  • SpringCloud中使用Sentinel实现限流的实战
    目录前言正文 SentinelSentinel的限流原理第一步:部署sentinel-dashboard第二步:在项目中整合sentinel前言 在分布式的项目中经常会遇到那种高并发...
    99+
    2024-04-02
  • java怎么使用Semaphore实现限流器
    这篇文章主要讲解了“java怎么使用Semaphore实现限流器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java怎么使用Semaphore实现限流器”吧!概念Semaphore可以看作...
    99+
    2023-06-30
  • 基于React.js和Node.js怎么实现SSR
    这篇文章主要介绍基于React.js和Node.js怎么实现SSR,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!基础概念SSR:即服务端渲染(Server Side Render) ...
    99+
    2024-04-02
  • React中怎么实现插槽
    今天小编给大家分享一下React中怎么实现插槽的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。React中实现插槽设计插槽在R...
    99+
    2023-07-05
  • react中的DOM操作怎么实现
    这篇“react中的DOM操作怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“react中的DOM操作怎么实现”文章吧...
    99+
    2023-06-05
  • React 组件权限控制的实现
    目录前话正文1. 控制方式1.1 直接计算1.2 通用权限Hoc1.3 权限包裹组件2. 控制结果2.1 显隐控制2.2 自定义渲染3. 权限数据3.1 静态权限3.2 动态权限前话...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作