【发布时间】:2017-11-09 19:10:13
【问题描述】:
我在这里阅读了很多关于 Google Task 的文章和答案,我的疑问是“rate”和“bucket_size”行为。
我阅读了以下文档: https://cloud.google.com/appengine/docs/standard/java/configyaml/queue
sn-p 是:
配置最大并发请求数
如果使用默认的 max_concurrent_requests 设置不 足够了,您可以更改 max_concurrent_requests 的设置, 如下例所示:
如果您的应用程序队列的速率为 20/s 且存储桶大小为 40, 该队列中的任务以 20/s 的速率执行,并且可以达到 40/s 简要地。如果任务延迟相对较低,这些设置可以正常工作; 但是,如果延迟显着增加,您将最终处理 显着更多的并发任务。这种额外的处理负载可以 消耗额外的实例并减慢您的应用程序。
例如,假设您的正常任务延迟为 0.3 秒。在此延迟下,您最多将处理大约 40 个任务 同时地。但是如果你的任务延迟增加到 5 秒,你 一次可以轻松处理 100 多个任务。这种增加 强制您的应用程序消耗更多实例来处理额外的 任务,可能会减慢整个应用程序并干扰 与用户请求。
您可以通过将 max_concurrent_requests 设置为 较低的价值。例如,如果您将 max_concurrent_requests 设置为 10, 当延迟为 0.3 时,我们的示例队列保持大约 20 个任务/秒 秒。但是,当延迟增加超过 0.5 秒时,这 设置节流处理速率以确保不超过 10 任务同时运行。
队列:
# 设置最大并发请求数为50
- 名称:优化队列
速率:20/s
桶大小:40
max_concurrent_requests: 10
我知道队列是这样工作的:
存储桶是确定要执行的任务数量的单位。
速率是每个周期执行的桶的数量。
max_concurrent_requests 是可以同时执行的最大值。
这里的这个 sn-p 可能很奇怪:
但是,如果您的任务延迟增加到 5 秒,您可以轻松地 一次处理超过 100 个任务。这种增加迫使您 应用程序消耗更多实例来处理额外的任务, 可能会减慢整个应用程序并干扰 用户请求。
假设 max_concurrent_requests 没有设置。 对我来说,不可能执行超过 100 个任务,因为 bucket_size 是 40。对我来说,低任务会影响任务等待空桶的时间。
为什么文档说任务可以有超过 100 个?
如果bucket是40,40以上可以同时运行吗?
编辑
桶被填满只是所有的任务都被执行了,或者如果某个桶是空闲的,那么下一个速率会增加吗? 例子: 40 个桶正在执行。 1桶完成。 想象一下,每个桶花费的时间超过 0.5 秒,有些桶的时间超过 1 秒。 当 1 个存储桶空闲时,这将在下一秒填满,还是存储桶等待所有任务完成后再重新填满?
【问题讨论】:
-
问题是延迟。如果队列以 20/s 的速度处理,但每个任务需要 10 秒,那么在 5 秒后(没有
max_concurrent_requests限制),它将处理 100 个任务。存储桶大小的定义更精确 in the doc 您链接但似乎起到了突发限制的作用。 -
对我来说,这个过程是:想象有 200 个任务排队,每个任务有 10 秒执行(延迟)。 1 -> 桶是空的 2 -> 在第一秒 20 个任务(速率)将被放入桶中执行。 3 -> 在第二个更多的 20 个任务(速率)将被放入桶中执行。 4 -> 在第三秒,因为桶已满,所以不会将任何东西(速率)放入桶中。因此,在这种情况下,不要有 100 个任务,因为存储桶已满,其他任务正在等待。
-
据我了解,如果您有 200 个任务排队并且存储桶大小为 40,则在第一秒 (t1) 将开始处理 40 个任务。同时 20 个令牌将被添加到存储桶中。因此,在 t2,20 个任务将准备好进行处理。如果没有
max_concurrent_setting,则这 20 个任务将开始处理,并且将添加另外 20 个令牌。如果max_concurrent_setting为 10,则不会发生任何事情,因为已经有超过 10 个进程在使用。 -
嗨@klenwell,谢谢你的解释,我还是有点困惑。在这里,我觉得这个作者的想法和你一样:stackoverflow.com/questions/38754085/… 这里,我觉得这个作者的想法和你不同,这个概念就是当slots为空时使用token。 stackoverflow.com/questions/28033610/…
-
嗨@klenwell,我做了一些测试,发现你说没问题。我无法将您的答案标记为正确。
标签: google-app-engine google-cloud-platform gcp