高并发下作为SQS事件处理器的NodeJS Lambda部分代码未执行如何排查
问题成因分析
- Google Calendar API 速率限制触发未捕获异常
这是最高概率的原因。Google Calendar API 对单个账号/项目的请求频率、并发数都有明确配额限制(默认单用户并发写请求通常不超过10次/秒),当Lambda并发数大于1时,多个请求同时调用calendar.events.insert接口,超过配额后接口会返回429(请求过多)或5xx错误。你的代码没有添加异常捕获逻辑,异步请求抛出错误后会直接终止Lambda函数执行,因此await后的console.log('data', data)不会运行,也不会输出错误日志(你当前的日志仅打印了INFO级别的内容)。
并发数设为1时,请求串行发送,不会触发速率限制,因此所有请求都能正常执行。 - Google API HTTP/2 连接复用异常
你在全局配置了google.options({ http2: true }),开启了HTTP/2连接复用。当同一个Lambda实例串行处理多条SQS消息时,如果上一次请求的HTTP/2连接出现异常未被正确重置,会导致后续请求卡住或直接失败,没有走到后续打印逻辑。 - Lambda 函数超时阈值设置过短
从日志看正常请求的执行时长约1.7秒,如果你的Lambda超时阈值设置为2秒,高并发下Google API响应延迟略微升高,就会触发Lambda超时强制终止函数,导致后续代码无法执行。
修复建议
- 首先添加全局异常捕获逻辑,打印错误信息定位具体问题,代码示例:
export const handler = async (event) => { try { const schemaEvent = getDataFromEvent(event) console.log('schemaEvent', schemaEvent) const { data } = await calendar.events.insert({ calendarId: CALENDAR_ID, requestBody: schemaEvent, sendUpdates: 'all', }) console.log('data', data) } catch (err) { // 打印错误详情,包括API返回的错误码、响应体 console.error('请求Google API失败', err) // 抛出错误让SQS重新投递消息,或者根据错误码处理(比如429错误添加退避重试) throw err } }
- 针对Google API速率限制,添加指数退避重试逻辑,或者将Lambda并发数限制在符合Google API配额的范围内。
- 适当调大Lambda超时阈值,建议设置为10秒以上,避免偶发的网络延迟导致函数提前终止。
- 如果确认是HTTP/2连接问题,可以先关闭HTTP/2配置,改用HTTP/1.1验证是否解决问题。
内容的提问来源于stack exchange,提问作者Pavlo Naumenko
相关产品推荐
相关产品推荐

