From a57fae31aa8c3a1879238d6ac20c8a77c04671f0 Mon Sep 17 00:00:00 2001 From: Xargin Date: Thu, 13 Dec 2018 15:46:47 +0800 Subject: [PATCH] update ratelimit img --- ch5-web/ch5-06-ratelimit.md | 2 +- images/ch5-token-bucket.png | Bin 0 -> 15370 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 images/ch5-token-bucket.png diff --git a/ch5-web/ch5-06-ratelimit.md b/ch5-web/ch5-06-ratelimit.md index 3410ca8..b2e57b1 100644 --- a/ch5-web/ch5-06-ratelimit.md +++ b/ch5-web/ch5-06-ratelimit.md @@ -108,7 +108,7 @@ Transfer/sec: 5.51MB 这两种方法看起来很像,不过还是有区别的。漏桶流出的速率固定,而令牌桶只要在桶中有令牌,那就可以拿。也就是说令牌桶是允许一定程度的并发的,比如同一个时刻,有 100 个用户请求,只要令牌桶中有 100 个令牌,那么这 100 个请求全都会放过去。令牌桶在桶中没有令牌的情况下也会退化为漏桶模型。 -![leaky bucket](../images/ch6-06-leaky-bucket.jpg) +![token bucket](../images/ch5-token-bucket.png) 实际应用中令牌桶应用较为广泛,开源界流行的限流器大多数都是基于令牌桶思想的。并且在此基础上进行了一定程度的扩充,比如 `github.com/juju/ratelimit` 提供了几种不同特色的令牌桶填充方式: diff --git a/images/ch5-token-bucket.png b/images/ch5-token-bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e849886d822ab97af879f9b0d1f780ff1175a9 GIT binary patch literal 15370 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 X@BY#vP+bk~_>yU==|YQdS%>`}!*9_` literal 0 HcmV?d00001