本文介绍如何在云函数控制台配置基于请求模式的并发管理。
操作步骤
开启请求多并发
1. 登录 Serverless 控制台,选择左侧导航栏中的 函数服务。
2. 在函数服务页面,选择需进行配置的 Web 函数名。
3. 在函数管理页面,选择函数配置。单击右上角的编辑,进入编辑模式。
4. 在“隔离、并发配置”中,单实例并发模式选择基于请求,在自定义静态并发下方的输入框中输入需要的并发值,开启请求多并发模式。如下图所示:

5. 单击保存完成配置。
注意事项
计费
未开启请求多并发时,单个函数实例一次只会处理一个请求,第一个请求处理完成才会开始处理下一个请求,内存时间的计费时长是每个请求的执行时长的加和,如下图所示:


开启请求多并发之后,单个函数实例一次会处理多个并发请求,第一个请求未结束时,如果第二个请求进来,则会有一段时间两个请求同时在处理,此时,交叠的这段时间只会计算一次。如下图所示:


日志
开启请求多并发后,由于多个并发请求同时处理,每个请求产生的日志在流式上报时,可能会出现日志和 RequestID 无法一一对应。此时,应该在代码中正确设置 logger,将 RequestID 打印到日志中,以解决该问题。RequestID 从 Web 函数中接收到的公共请求头里的
X-Scf-Request-Id
字段(部分框架为 x-scf-request-id
)获取。NodeJS 示例代码
let WebSocketServer = require('ws').Server;let wss = new WebSocketServer({ port: 9000 });wss.on('connection', function connection(ws) {let requestID = ws.upgradeReq.headers['x-scf-request-id'];console.log('requestID: %s', requestID);ws.on('message', function incoming(message) {console.log('requestID: %s', requestID);console.log('received: %s', message);});});
超限错误
内存超限
请求多并发会增加内存超限的概率,在内存超限 OOM 发生时,实例会进行重启,此时,实例内正在处理的多个请求会同时出现 abort 中断错误,错误码为 434 MemoryLimitReached。请在设置并发值之前,先对函数进行压测以确定安全的并发值,以避免内存超限带来的影响。
超时
请求耗时过长,在配置的执行超时时间范围内没有执行完成时,会终止该请求,向客户端返回错误码 433 TimeLimitReached。实例内的其他正在进行中的请求不受影响。
监控
开启请求多并发后,在监控页面会出现“并发请求个数”面板,可直观看到指定时间段内的请求并发情况。


监控常见问题
对一段时间没有调用的函数发起并发请求,会出现虽然并发请求数量未超过设定的并发值,但监控“并发实例个数和预置并发”面板中显示的并发实例个数大于 1 的情况。这是因为一段时间没有调用,函数实例回收资源,此时发起请求,会出现冷启动,为保障及时响应处理进来的请求,此时会并发拉起函数实例,直到第一个实例可以正常接收请求为止。如果是普通的 HTTP 请求,过一段时间之后,新请求会集中在若干个函数实例上进行处理,其余的函数实例会在请求处理结束后逐步下线,监控中的并发实例数恢复正常。如果是 WebSocket 连接,则在连接未断开之前,并发实例数都会维持在一开始拉起的数量。通过配置动态预置避免冷启动,可以减少这类问题发生的概率。