令牌桶算法

QOS-QOS(服务质量)概述

泄露秘密 提交于 2020-01-08 10:27:54
QOS-QOS(服务质量)概述 2018年7月7日 20:29 概述及背景: 1. 引入: 传统IP网络仅提供“尽力而为”的传输服务,网络有可用资源就转发,资源不足时就丢弃 新一代IP网络承载了 语音、视频等实时互动信息,要求网络能提供有保证的服务质量 QOS允许用户在丢包、延迟、抖动和 带宽等方面获得可预期的服务水平 2.网络性能衡量的参数: 带宽: 是链路上单位时间所能通过的最大数据流量,其单位为bps 在一条端到端的链路中,最大 可用带宽等于路径上带宽最低的链路的带宽 延迟:是标识数据包穿越网络所用时间的指标 处理延迟 交换延迟:路由器查表时 排队延迟:数据包在出接口排队的延迟 传播延迟:数据在链路上传播的时间 抖动: 是指数据包穿越网络时延迟的变化,是衡量网络延迟稳定性的指标 是由于延迟的随机性造成的,主要原因是数据包排队延迟的不确定性 丢包率: 丢包是指数据包扎传输过程中的丢失,是衡量网络可靠性的重要指标 丢包的主要原因: 网络拥塞时,当队列满了后,后续的报文将由于无法入队而被丢弃 流量超过限制时,设备对其进行丢弃 丢包以丢包率作为衡量指标 丢包率=被丢包报文数量/全部报文数量 注意: 语音需要低带宽,低延时,低抖动的网络 数据流量需要高带宽,低丢包率的网络 视频流量需要高带宽,低延时,低抖动的网络 QOS不能参加先有的带宽,只能将现有的带宽优化。 3

QOS-QOS(服务质量)概述

帅比萌擦擦* 提交于 2020-01-05 09:26:31
QOS-QOS(服务质量)概述 2018年7月7日 20:29 概述及背景: 1. 引入: 传统IP网络仅提供“尽力而为”的传输服务,网络有可用资源就转发,资源不足时就丢弃 新一代IP网络承载了 语音、视频等实时互动信息,要求网络能提供有保证的服务质量 QOS允许用户在丢包、延迟、抖动和 带宽等方面获得可预期的服务水平 2.网络性能衡量的参数: 带宽: 是链路上单位时间所能通过的最大数据流量,其单位为bps 在一条端到端的链路中,最大 可用带宽等于路径上带宽最低的链路的带宽 延迟:是标识数据包穿越网络所用时间的指标 处理延迟 交换延迟:路由器查表时 排队延迟:数据包在出接口排队的延迟 传播延迟:数据在链路上传播的时间 抖动: 是指数据包穿越网络时延迟的变化,是衡量网络延迟稳定性的指标 是由于延迟的随机性造成的,主要原因是数据包排队延迟的不确定性 丢包率: 丢包是指数据包扎传输过程中的丢失,是衡量网络可靠性的重要指标 丢包的主要原因: 网络拥塞时,当队列满了后,后续的报文将由于无法入队而被丢弃 流量超过限制时,设备对其进行丢弃 丢包以丢包率作为衡量指标 丢包率=被丢包报文数量/全部报文数量 注意: 语音需要低带宽,低延时,低抖动的网络 数据流量需要高带宽,低丢包率的网络 视频流量需要高带宽,低延时,低抖动的网络 QOS不能参加先有的带宽,只能将现有的带宽优化。 3

限流算法之漏桶算法、令牌桶算法

谁说胖子不能爱 提交于 2019-12-19 11:53:20
昨天CodeReview的时候看到同时使用RateLimiter这个类用作QPS访问限制.学习一下这个类. RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类. 1.限流 每个API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性.即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统瘫痪. 通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务,或者引流. 如果要准确的控制QPS,简单的做法是维护一个单位时间内的Counter,如判断单位时间已经过去,则将Counter重置零.此做法被认为没有很好的处理单位时间的边界,比如在前一秒的最后一毫秒里和下一秒的第一毫秒都触发了最大的请求数,将目光移动一下,就看到在两毫秒内发生了两倍的QPS. 2.限流算法 常用的更平滑的限流算法有两种:漏桶算法和令牌桶算法. 很多传统的服务提供商如华为中兴都有类似的专利,参考: http://www.google.com/patents/CN1536815A?cl=zh 2.1 漏桶算法 漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求

常见的限流算法

对着背影说爱祢 提交于 2019-12-12 11:13:42
在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。 常见的限流方式,比如Hystrix适用线程池隔离,超过线程池的负载,走熔断的逻辑。在一般应用服务器中,比如tomcat容器也是通过限制它的线程数来控制并发的;也有通过时间窗口的平均速度来控制流量。常见的限流纬度有比如通过Ip来限流、通过uri来限流、通过用户访问频次来限流。 一般限流都是在网关这一层做,比如Nginx、Openresty、kong、zuul、Spring Cloud Gateway等;也可以在应用层通过Aop这种方式去做限流。 本文详细探讨在 Spring Cloud Gateway 中如何实现限流。 常见的限流算法 计数器算法 计数器算法采用计数器实现限流有点简单粗暴,一般我们会限制一秒钟的能够通过的请求数,比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。具体的实现可以是这样的:对于每次服务调用,可以通过AtomicLong#incrementAndGet()方法来给计数器加1并返回最新值,通过这个最新值和阈值进行比较。这种实现方式,相信大家都知道有一个弊端

对高并发流量控制的一点思考

天大地大妈咪最大 提交于 2019-12-09 21:30:33
前言 在实际项目中,曾经遭遇过线上5W+QPS的峰值,也在压测状态下经历过10W+QPS的大流量请求,本篇博客的话题主要就是自己对高并发流量控制的一点思考。 应对大流量的一些思路 首先,我们来说一下什么是大流量? 大流量,我们很可能会冒出:TPS(每秒事务量),QPS(每秒请求量),1W+,5W+,10W+,100W+...。其实并没有一个绝对的数字,如果这个量造成了系统的压力,影响了系统的性能,那么这个量就可以称之为大流量了。 其次,应对大流量的一些常见手段是什么? 缓存:说白了,就是让数据尽早进入缓存,离程序近一点,不要大量频繁的访问DB。 降级:如果不是核心链路,那么就把这个服务降级掉。打个比喻,现在的APP都讲究千人千面,拿到数据后,做个性化排序展示,如果在大流量下,这个排序就可以降级掉! 限流:大家都知道,北京地铁早高峰,地铁站都会做一件事情,就是限流了!想法很直接,就是想在一定时间内把请求限制在一定范围内,保证系统不被冲垮,同时尽可能提升系统的吞吐量。 注意到,有些时候,缓存和降级是解决不了问题的,比如,电商的双十一,用户的购买,下单等行为,是涉及到大量写操作,而且是核心链路,无法降级的,这个时候,限流就比较重要了。 那么接下来,我们重点说一下,限流。 限流的常用方式 限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌。 计数器 计数器是一种比较简单的限流算法

限流算法

时光毁灭记忆、已成空白 提交于 2019-12-09 15:53:21
高并发的解决手段有缓存、异步消息队列、集群、限流。 而限流又分为nginx层限流、业务代码层的限流,本文着重说下业务代码层面的限流手段。 限流算法 计数器算法、漏桶、令牌桶 1 计数器算法 最简单粗暴的方式 通过控制时间频率能够允许的并发请求数量,例如: 1秒允许某接口接收1000条请求,超过100条会丢弃请求, 下1秒又重新计数。 缺点:对于短时间的并发激增无法解决,例如: 1分钟允许100条请求,第1s就已经接收了100条请求,后面的59秒就不能处理请求数据了。 2 漏桶算法 类似一个倒立的漏桶,桶口的流量不论多大,桶底都是按照固定频率输出。 不管调用方多么不稳定,通过漏桶算法限流,每10毫秒处理一次请求,处理的速度是固定的。因为是桶,都是有容量上限,一旦桶满了,新进来的请求就会被丢弃掉。 实现上可以准备一个队列用来保存请求,另外通过一个线程池异步从队列中取数据消费,类似消息队列处理机制。 缺点:也不能应付短时间激增的并发请求,导致桶达到上限,新的请求都会被拒绝。 3 令牌桶算法 是对漏桶算法的优化,令牌桶有个桶,用来存放令牌,算法机制会以一定频率的速度往桶中生产令牌, 当有请求过来时,从桶中取令牌,拿到令牌才可以继续执行,否则排队等待或者直接拒绝。 实现上可以用一个队列来保存令牌,另外通过线程池来定期往队列中存放生成的令牌,新来的请求,就从队列中获取一个令牌,才可以继续执行。

从构建分布式秒杀系统聊聊限流特技

谁都会走 提交于 2019-12-06 21:00:58
前言 俗话说的好,冰冻三尺非一日之寒,滴水穿石非一日之功,罗马也不是一天就建成的。两周前秒杀案例初步成型,分享到了中国最大的同 性友网站-码云。同时也收到了不少小伙伴的建议和投诉。我从不认为分布式、集群、秒杀这些就应该是大厂的专利,在互联网的今天无论什么时候都要时刻武装自己,只有这样,也许你的春天就在明天。 在开发秒杀系统案例的过程中,前面主要分享了队列、缓存、锁和分布式锁以及静态化等等。缓存的目的是为了提升系统访问速度和增强系统的处理能力;分布式锁解决了集群下数据的安全一致性问题;静态化无疑是减轻了缓存以及DB层的压力。 限流 然而再牛逼的机器,再优化的设计,对于特殊场景我们也是要特殊处理的。就拿秒杀来说,可能会有百万级别的用户进行抢购,而商品数量远远小于用户数量。如果这些请求都进入队列或者查询缓存,对于最终结果没有任何意义,徒增后台华丽的数据。对此,为了减少资源浪费,减轻后端压力,我们还需要对秒杀进行限流,只需保障部分用户服务正常即可。 就秒杀接口来说,当访问频率或者并发请求超过其承受范围的时候,这时候我们就要考虑限流来保证接口的可用性,以防止非预期的请求对系统压力过大而引起的系统瘫痪。通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务。 限流算法 任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶。 令牌桶 令牌桶算法是网络流量整

流量调整和限流技术

▼魔方 西西 提交于 2019-12-06 12:30:58
漏桶算法: https://en.wikipedia.org/wiki/Leaky_bucket 它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 简单的理解为:漏桶算法思路很简单,水(数据或者请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。 在桶满水之后,常见的两种处理方式为: 1)暂时拦截住上方水的向下流动,等待桶中的一部分水漏走后,再放行上方水。 2)溢出的上方水直接抛弃。 将水看作网络通信中数据包的抽象,则 方式1起到的效果称为Traffic Shaping(流量整形), 方式2起到的效果称为Traffic Policing(流量策略)。 由此可见,Traffic Shaping 的核心理念是“等待”,Traffic Policing 的核心理念是“丢弃”。它们是两种常见的流速控制方法。 在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的参数(恒定的速率往下漏水),所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使某一个单独的流突发到端口速率。因此

Redis令牌桶限流

天涯浪子 提交于 2019-12-04 07:02:11
一 、场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制。比如对于某个 用户,他在一个时间段(interval)内,比如 1 分钟,调用服务器接口的次数不能够 大于一个上限(limit),比如说 100 次。如果用户调用接口的次数超过上限的话,就直接拒绝用户的请求,返回错误信息。 服务接口的流量控制策略:分流、降级、限流等。本文讨论下限流策略,虽然降低了服务接口的访问频率和并发量,却换取服务接口和业务应用系统的高可用。 二、常用的限流算法 1、漏桶算法 漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率.示意图如下:     可见这里有两个变量,一个是桶的大小,支持流量突发增多时可以存多少的水(burst),另一个是水桶漏洞的大小(rate)。 因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使流突发(burst)到端口速率.因此,漏桶算法对于存在突发特性的流量来说缺乏效率. 2、令牌桶算法 令牌桶算法(Token Bucket)和 Leaky Bucket

高并发之限流方案

匿名 (未验证) 提交于 2019-12-03 00:38:01
首先,我们来说一下什么是大流量? 大流量,我们很可能会冒出:TPS(每秒事务量),QPS(每秒请求量),1W+,5W+,10W+,100W+...。其实并没有一个绝对的数字,如果这个量造成了系统的压力,影响了系统的性能,那么这个量就可以称之为大流量了。 其次,应对大流量的一些常见手段是什么? 缓存:说白了,就是让数据尽早进入缓存,离程序近一点,不要大量频繁的访问DB。 降级:如果不是核心链路,那么就把这个服务降级掉。打个比喻,现在的APP都讲究千人千面,拿到数据后,做个性化排序展示,如果在大流量下,这个排序就可以降级掉! 限流:大家都知道,北京地铁早高峰,地铁站都会做一件事情,就是限流了!想法很直接,就是想在一定时间内把请求限制在一定范围内,保证系统不被冲垮,同时尽可能提升系统的吞吐量。 注意到,有些时候,缓存和降级是解决不了问题的,比如,电商的双十一,用户的购买,下单等行为,是涉及到大量写操作,而且是核心链路,无法降级的,这个时候,限流就比较重要了。 那么接下来,我们重点说一下,限流。 限流的常用方式 限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌。 计数器 计数器是一种比较简单的限流算法,用途比较广泛,在接口层面,很多地方使用这种方式限流。在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0。 这里需要注意的是,存在一个时间临界点的问题。举个栗子,在12