对于 Cloud Run,每个修订版本都会根据处理所有传入请求所需的实例数量而自动扩缩。
处理请求的实例越多,占用的 CPU 和内存就越多,因而产生的费用也越高。
为了让您获得更多控制权,Cloud Run 提供每个实例的并发请求数上限设置,用于指定给定实例可以同时处理的请求数量上限。
每个实例的并发请求数上限
您可以配置每个实例的并发请求数上限。默认情况下,每个 Cloud Run 实例可以同时接收最多 80 个请求;您最多可以将此上限提高到 1000。
虽然您应该使用该默认值,但如果需要,您也可以减小并发数上限。例如,如果您的代码无法处理并行请求,请将并发设置为 1
。
指定的并发值为最大值,如果实例的 CPU 已被充分利用,则 Cloud Run 可能不会向指定实例发送这么多请求。
下图展示了每个实例的并发请求数上限会对处理传入并发请求所需的实例数量产生何影响:
何时将并发数上限设置为一次处理一个请求。
您可以限制并发设置,以确保一次只有一个请求发送到每个正在运行的实例。在下列情况下,建议您考虑执行此操作:
- 每个请求都会使用大部分可用 CPU 或内存。
- 您的容器映像并非设计用于同时处理多个请求,例如,如果您的容器依赖于两个请求无法共享的全局状态。
请注意,将并发请求数设置为 1
可能会对扩缩性能造成负面影响,因为许多实例都将需要启动才能处理急剧增加的传入请求。
案例研究
以下指标展示了一个用例,其中 400 个客户端每秒向一个 Cloud Run 服务发出 3 个请求,该服务的每个实例的并发请求数上限设置为 1。顶部的绿线表示一段时间内的请求数,而底部蓝线表示开始处理请求的实例数量。
以下指标显示 400 个客户端每秒向一个 Cloud Run 服务发出 3 个请求,该服务的每个实例的并发请求数上限设置为 80。顶部的绿线表示一段时间内的请求数,而底部蓝线表示开始处理请求的实例数量。请注意,处理相同请求量所需的实例要少得多。
源代码部署的并发性
启用并发后,Cloud Run 不会在同一实例处理的并发请求之间提供隔离。在这种情况下,您必须确保您的代码可以安全地并发执行。您可以通过设置其他并发值来更改此设置。我们建议您先从较低的并发数(例如 8)开始,然后再逐渐增加。从太高的并发设置开始可能会由于资源(例如内存或 CPU)限制而导致意外行为。
语言运行时也可能会影响并发性。以下列表显示了这些因语言而异的影响:
Node.js 在本质上是单线程的。若要利用并发功能,请使用 JavaScript 的异步代码样式,该这是 Node.js 中的一种惯用样式。如需了解详情,请参阅 Node.js 官方文档中的异步流控制部分。
对于 Python 3.8 及更高版本,若要支持每个实例的高并发性,则需要有足够的线程来处理并发性。我们建议您设置运行时环境变量,使线程数值等于并发值,例如:
THREADS=8
。
后续步骤
如需管理 Cloud Run 服务的每个实例的并发请求数上限,请参阅设置每个实例的并发请求数上限。
如需优化每个实例的并发请求数上限设置,请参阅关于调整并发设置的开发提示。