fenixsoft / awesome-fenix

讨论如何构建一套可靠的大型分布式系统
https://icyfenix.cn
8.55k stars 994 forks source link

「Comment」https://icyfenix.cn/distribution/traffic-management/traffic-control.html #194

Open fenixsoft opened 3 years ago

fenixsoft commented 3 years ago

https://icyfenix.cn/distribution/traffic-management/traffic-control.html

UUNNFLY commented 3 years ago

“只要在令牌中增加一个时间戳记录,每次获取令牌前,比较一下时间戳与当前时间,就可以轻易计算出这段时间需要放多少令牌进去,然后一次过放完全部令牌即可”一次性写错了。 这句话的意思是在获取令牌时顺便放令牌吗

fenixsoft commented 3 years ago

@UUNNFLY “只要在令牌中增加一个时间戳记录,每次获取令牌前,比较一下时间戳与当前时间,就可以轻易计算出这段时间需要放多少令牌进去,然后一次过放完全部令牌即可”一次性写错了。 这句话的意思是在获取令牌时顺便放令牌吗

在每次取令牌时放也可以,一般来说,考虑到实现效率,在每次取不到令牌时放会更合适些。

coldJune commented 2 years ago

“以上这三点都是基于都调用计数的指标”是否多了一个“都”

zhyncs commented 2 years ago

TCP 用到滑动窗口算法的应该是流量控制,不是拥塞控制

fenixsoft commented 2 years ago

TCP 用到滑动窗口算法的应该是流量控制,不是拥塞控制

感谢指正,已更新。

kelley42a commented 2 years ago

假设不考虑顺序且请求分发是均衡的,在保证不超时的前提下,整个集群能持续承受最多每秒多少笔业务操作?

答:40 × 10 ÷ 5 = 80 TPS

shouldn't it simply be 40 TPS?

xumingguan commented 2 years ago

40 × 10 ÷ 5 = 80 TPS 这个单个服务的0.5s是平均情况,也有快速的情况,80是个参考值,具体的应该压测,或者流量回放更准确一些

HsiangCheng commented 2 years ago

40 × 10 ÷ 5 = 80TPS,这个计算公式想不明白。能解答一下QPS是怎么换算到TPS的吗?

gzp112153 commented 2 years ago

@HsiangCheng 40 × 10 ÷ 5 = 80TPS,这个计算公式想不明白。能解答一下QPS是怎么换算到TPS的吗?

集群每秒总的能力是40 × 10,每个业务1秒处理完成需要的能力是5 这样每秒就可以处理80次业务

qq271859852 commented 2 years ago

尽管扫描支付二维码时尽管客户端只发送了一个请求


这句话多了尽管俩字,正确的应该是:尽管扫描支付二维码时客户端只发送了一个请求

etatata commented 2 years ago

整个集群能持续承受最多每秒多少笔业务,4010/5 = 80 笔。这里应该是错了,单个服务是40。10个服务合起来整个业务数,也不可能超过单个服务的请求数。应该4010/10=40笔。40*10是一秒钟10个服务处理的所有请求数,每一个业务需要处理10个请求。

younghluuu commented 1 year ago

@etatata 整个集群能持续承受最多每秒多少笔业务,4010/5 = 80 笔。这里应该是错了,单个服务是40。10个服务合起来整个业务数,也不可能超过单个服务的请求数。应该4010/10=40笔。40*10是一秒钟10个服务处理的所有请求数,每一个业务需要处理10个请求。

但是,这一个业务的10个请求不是必须要在1秒内发生的。这个业务走完一个流程是5s,所以是400/5不是400/10.前提是不考虑执行顺序而且请求均衡

xiguazhiPrince commented 1 year ago

@younghluuu

@etatata 整个集群能持续承受最多每秒多少笔业务,4010/5 = 80 笔。这里应该是错了,单个服务是40。10个服务合起来整个业务数,也不可能超过单个服务的请求数。应该4010/10=40笔。40*10是一秒钟10个服务处理的所有请求数,每一个业务需要处理10个请求。

但是,这一个业务的10个请求不是必须要在1秒内发生的。这个业务走完一个流程是5s,所以是400/5不是400/10.前提是不考虑执行顺序而且请求均衡

还是没有明白为什么要除5, 是怎么得出来的5啊,

im-sure commented 1 year ago

@younghluuu

@etatata 整个集群能持续承受最多每秒多少笔业务,4010/5 = 80 笔。这里应该是错了,单个服务是40。10个服务合起来整个业务数,也不可能超过单个服务的请求数。应该4010/10=40笔。40*10是一秒钟10个服务处理的所有请求数,每一个业务需要处理10个请求。

但是,这一个业务的10个请求不是必须要在1秒内发生的。这个业务走完一个流程是5s,所以是400/5不是400/10.前提是不考虑执行顺序而且请求均衡

这个单位是有问题的吧,400的单位是 query/s,5的单位是 s/t,最后得出来并不是 t/s。如果是 400q/s ÷ 10q/t = 40t/s 这样感觉是对的,但是整个题目就和超时时间无关了

yaoqiangpersonal commented 1 year ago

我觉得应该是 40t/s 10s (10s/5s) /10s = 80t/s。简化后就是 40t/s * (10s/5s) ,这样就很好理解来了,就是算倍数而已。

jackyfkc commented 1 year ago

漏桶在代码实现上非常简单,它其实就是一个以请求对象作为元素的先入先出队列(FIFO Queue),队列长度就相当于漏桶的大小,当队列已满时便拒绝新的请求进入

这里的描述看起来不完整,并没有说清楚是如何实现按给定速率流出的;另我看 uber ratelimit 的实现,其中并没有用到 queue, 简化版Python实现如下

class LeakyBucket_V1:
    def __init__(self, rate, per=1):
        self.per_request = per / rate
        self.last = 0

    def take(self, n=1):
        now = time.time()
        sleep_for = self.per_request - (now - self.last)
        if sleep_for > 0:
            time.sleep(sleep_for)
            self.last = now + sleep_for
        else:
            self.last = now

def testV1():
    rl = LeakyBucket_V1(1)  # 1 per second
    for _ in range(10):
        rl.take()
        time.sleep(0.1)  # simulate hard work
        Log.info("<---do a job")
ziqianggeoffreychen commented 3 weeks ago

@younghluuu

@etatata 整个集群能持续承受最多每秒多少笔业务,40_10/5 = 80 笔。这里应该是错了,单个服务是40。10个服务合起来整个业务数,也不可能超过单个服务的请求数。应该40_10/10=40笔。40*10是一秒钟10个服务处理的所有请求数,每一个业务需要处理10个请求。

但是,这一个业务的10个请求不是必须要在1秒内发生的。这个业务走完一个流程是5s,所以是400/5不是400/10.前提是不考虑执行顺序而且请求均衡

这个单位是有问题的吧,400的单位是 query/s,5的单位是 s/t,最后得出来并不是 t/s。如果是 400q/s ÷ 10q/t = 40t/s 这样感觉是对的,但是整个题目就和超时时间无关了

我是这样理解的: 正常算出来的系统容量是 40 TPS,这时候,每笔业务是 5 秒。但超时时间又是 10 秒,所以,这里就有文章可以作:让每笔业务都处理慢点,但又不至于超时,这样能产生更多业务同时完成的效果。意思就是“移谷造山”吧(与削峰填谷反过来)。具体来说,某一秒来了 80 笔业务,CPU 轮流使用,第 5 秒的时候本来可以有 40 笔业务可以处理完,但由于多了一倍的业务排队,假如公平的话,那么直到第10秒的时候,这80笔业务才一起全部处理完。也就是把这一秒能完成的业务,和下一秒能完成的业务,堆到一起来完成,这一秒 0 T,下一秒 80 T,平均起来仍然是 40 TPS,但峰值却是 80 TPS,而且是“可持续”的(虽然需要间隔一秒来完成)。