热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

c++分布式令牌桶_分布式系统限流算法剖析:漏桶与令牌桶

前言限流机制主要用于对流入系统的请求流量进行限制,保证在任何时候进入系统的请求流量都是可控的。即不能超过系统预设的最大流量值,超过则需要排队等待或者直接
前言

限流机制主要用于对流入系统的请求流量进行限制,保证在任何时候进入系统的请求流 量都是可控的。即不能超过系统预设的最大流量值,超过则需要排队等待或者直接拒绝,从 而避免高并发流量全部涌入系统,导致超出了系统的处理能力而出现系统机器宕机和服务不 可用问题。

限流机制在实现层面,一般是基于漏桶算法或令牌桶算法来实现的,如下对这两种算法进行具体分析。

漏桶算法

对于漏桶算法,首先可以抽象为在业务服务前面,放置了一个漏桶来接收请求流量,然 后在漏桶中开一个指定大小的口来将这些请求流量流出给业务服务处理。由于漏桶的口是固 定的,故交给业务服务处理的请求流量也是固定的,而不会受到流入漏桶的请求流量的大小 的影响。如图所示:

61825fbe2877b1ced9efdb435c20df3e.png

即如果请求流量较小,则可以直接通过该漏桶的口流出给业务服务处理;如果请求 流量过大,该口无法及时流出个业务服务处理,则首先会在漏桶中累计。在实际实现当中可 以使用有界队列来实现请求的累计,如果请求流量占满了漏桶空间,则后续请求会溢出,即 请求被直接拒绝。

所以通过漏桶交给业务服务处理的请求流量是可控的,以及根据漏桶口的大小以恒定速 率流出请求流程给业务服务处理,不会受到突发流量的影响,从而避免了突发的、超过服务 处理能力的高并发请求流量压垮业务服务。

令牌桶算法

与漏桶算法将请求流入到漏桶,然后由漏桶流出给业务服务处理不同,在令牌桶算法中, 每个请求在交给业务服务处理之前,都需要首先从令牌桶获取一个令牌,如果获取成功则可 以交给对应的业务服务处理,如果获取失败则需要等待或者直接拒绝。如图所示:

26f7d5733d3c35005c6b376d02599b8d.png

令牌桶中的令牌是业务服务根据自身处理能力来以恒定的速率添加到令牌桶的,如 200r/s,每秒 200 个,则业务服务每秒最多可以处理 200 个请求,超过的请求则需要阻塞等 待或者被拒绝。而每秒添加令牌可以一次性添加,也可以分多次添加,不过一般是分多次添 加,如 200r/s 可以是是每 500 毫秒添加 100 个。

除此之外,如果每秒的请求个数达不到每秒投放到令牌桶的令牌的个数,如实际请求为 每秒 100 个,而业务服务投放令牌到令牌桶为每秒 200 个,故此时的请求流量低于业务服务 的指定速率。所以多余的令牌会在令牌桶累计,直到到达该桶的大小,如令牌桶可以最多存 放 500 个,超过的令牌则直接丢弃。其中令牌桶的大小也是按照业务服务的最大处理能力来 设定的,如业务服务每秒处理 200 个性能是最好的,但是也可以接收 500 个请求的突发流量。

由于业务服务会继续以指定速率添加令牌,故如果实际的请求达到的速率一直达不到令牌投放的速率,则一段时间后令牌桶会保持有 500 个令牌。如果之后某段时间突然有 500 个请求过来,则这 500 个请求可以交给业务服务处理。

区别

所以与漏桶算法相比,令牌桶算法除了支持对请求流量进行控制,使得请求流量以指定 速率交给业务服务处理之外,还支持处理异常突发流量,从而实现对业务服务最大处理能力 的利用。



推荐阅读
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • TCP协议中的可靠传输机制分析
    本文深入探讨了TCP协议如何通过滑动窗口和超时重传来确保数据传输的可靠性,同时介绍了流量控制和拥塞控制的基本原理及其在实际网络通信中的应用。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文详细介绍了二叉堆的概念及其在Java中的实现方法。二叉堆是一种特殊的完全二叉树,具有堆性质,常用于实现优先队列。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 本文详细介绍了进程、线程和协程的概念及其之间的区别与联系。进程是在内存中运行的独立实体,具有独立的地址空间和资源;线程是操作系统调度的基本单位,属于进程内部;协程则是用户态下的轻量级调度单元,性能更高。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 本文详细介绍了JVM内存分配的相关知识,包括内存规整、内存分配方式以及并发指针碰撞问题的解决方案。 ... [详细]
  • 深入解析Python进程间通信:Queue与Pipe的应用
    本文详细探讨了Python中进程间通信的两种常用方法——Queue和Pipe,并通过具体示例介绍了它们的基本概念、使用方法及注意事项。 ... [详细]
  • 前言:由于Android系统本身决定了其自身的单线程模型结构。在日常的开发过程中,我们又不能把所有的工作都交给主线程去处理(会造成UI卡顿现象)。因此,适当的创建子线程去处理一些耗 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
author-avatar
N个小灰流_701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有