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

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

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

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

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

漏桶算法

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

61825fbe2877b1ced9efdb435c20df3e.png

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

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

令牌桶算法

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

26f7d5733d3c35005c6b376d02599b8d.png

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

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

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

区别

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



推荐阅读
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
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社区 版权所有