From f6af94243a8e6c85ae8725736106bf25cff139b7 Mon Sep 17 00:00:00 2001 From: Xargin Date: Sat, 16 Jun 2018 22:16:06 +0800 Subject: [PATCH] add image --- ch5-web/ch5-06-ratelimit.md | 1 + images/ch6-06-leaky-bucket.jpg | Bin 0 -> 17691 bytes 2 files changed, 1 insertion(+) create mode 100644 images/ch6-06-leaky-bucket.jpg diff --git a/ch5-web/ch5-06-ratelimit.md b/ch5-web/ch5-06-ratelimit.md index d950a2f..e73693b 100644 --- a/ch5-web/ch5-06-ratelimit.md +++ b/ch5-web/ch5-06-ratelimit.md @@ -109,6 +109,7 @@ Transfer/sec: 5.51MB 这两种方法看起来很像,不过还是有区别的。漏桶流出的速率固定,而令牌桶只要在桶中有令牌,那就可以拿。也就是说令牌桶是允许一定程度的并发的,比如同一个时刻,有 100 个用户请求,只要令牌桶中有 100 个令牌,那么这 100 个请求全都会放过去。令牌桶在桶中没有令牌的情况下也会退化为漏桶模型。 TODO,这里需要画漏桶和令牌桶的图 +![leaky bucket](../images/ch6-06-leaky-bucket.jpg) 实际应用中令牌桶应用较为广泛,开源界流行的限流器大多数都是基于令牌桶思想的。并且在此基础上进行了一定程度的扩充,比如 `github.com/juju/ratelimit` 提供了几种不同特色的令牌桶填充方式: diff --git a/images/ch6-06-leaky-bucket.jpg b/images/ch6-06-leaky-bucket.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6722e6277c0b1f5d597a44816b2e519a5d173a4a GIT binary patch literal 17691 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 NGx6q