我在这里阅读了很多关于Google Task的文章和答案,我的疑问是"率"和" bucket_size"行为。
我阅读了这份文件: https://cloud.google.com/appengine/docs/standard/java/configyaml/queue
该片段是:
配置最大并发请求数
如果不使用默认的max_concurrent_requests设置 够了,你可以改变max_concurrent_requests的设置, 如下例所示:
如果您的应用程序队列的速率为20 / s且存储桶大小为40, 该队列中的任务以20 / s的速率执行,并且可以突发到40 / s 简要介绍。如果任务延迟相对较低,这些设置可以正常工作; 但是,如果延迟显着增加,您将最终处理完毕 并发任务明显增多。这个额外的处理负载可以 消耗额外的实例并减慢您的应用程序。
例如,假设您的正常任务延迟为0.3 秒。在此延迟时间内,您最多可处理约40个任务 同时。但如果您的任务延迟增加到5秒,那么您 可以轻松地同时处理100多个任务。这种增加 强制您的应用程序使用更多实例来处理额外的操作 任务,可能会减慢整个应用程序和干扰 用户请求。
您可以通过将max_concurrent_requests设置为a来避免这种可能性 价值较低。例如,如果将max_concurrent_requests设置为10, 当延迟为0.3时,我们的示例队列维持大约20个任务/秒 秒。但是,当延迟增加超过0.5秒时,这就是 设置限制处理速率以确保不超过10 任务同时进行。
队列:
#将最大并发请求数设置为50
- name:optimize-queue
率:20 / s
bucket_size:40
max_concurrent_requests:10
我知道队列的工作原理如下:
存储桶是确定执行任务量的单位。
费率是每个期间执行的桶数。
max_concurrent_requests是可以同时执行的最大值。
这个片段可能很奇怪:
但如果您的任务延迟增加到5秒,您可以轻松拥有 一次处理超过100个任务。这种增加迫使你的 应用程序消耗更多实例来处理额外的任务, 可能会减慢整个应用程序并干扰 用户请求。
想象一下,没有设置max_concurrent_requests。 对我来说,执行100多个任务是不可能的,因为bucket_size是40.对我来说,低任务会影响任务等待空桶的时间。
为什么文档说任务可以超过100?
如果桶是40,可以同时运行40多个?
只是执行了所有任务,或者如果某个存储桶在下一个速率下空闲,那么存储桶是否会被填满? 例: 正在执行40个桶。 1桶完成。 想象一下,每个桶花费超过0.5秒,一些桶超过1秒。 当1个桶空闲时,这将在下一秒填满或者桶在等待桶再次填满之前等待所有任务完成?
答案 0 :(得分:2)
您更精确地定义了铲斗尺寸in the doc,但想到它的一种方法是作为一种初始爆破限制。
根据您在问题中提供的参数,我了解它的运作方式:
在第一秒(t1)中,40个任务将开始处理。同时,20个令牌(基于rate
)将添加到存储桶中。因此,在t2处,将准备20个任务以进行处理,并且将另外20个令牌添加到桶中。
如果没有max_concurrent_setting
,则这20个任务将开始处理。如果max_concurrent_setting
为10,则不会发生任何事情,因为已经有超过10个进程在使用。
App Engine将继续以20 / s的速率向存储桶添加令牌,但前提是存储桶中有空间(bucket_size
)。一旦桶中有40个令牌,它将停止,直到某些运行过程完成并且有更多空间。
在完成40个任务的初始突发之后,一次执行的任务不应超过10个。