为什么我的Lambda函数单次调用会向SQS队列发送两次消息?
问题原因分析
根本原因是代码同时使用了回调和Promise两种方式调用AWS SQS的sendMessage方法,导致单次函数执行触发了两次独立的消息发送请求。
AWS JavaScript SDK v2的服务方法逻辑如下:
- 调用
sqs.sendMessage(params, 回调函数)时,只要传入了回调参数,SDK会立即执行一次SQS API请求,请求返回后自动执行你传入的回调函数,输出第一条Success日志。 - 你后续又链式调用了
.promise()方法,AWS SDK的Request对象调用.promise()时会再次触发一次独立的SQS API请求,所以会发送第二条消息。
另外你写的.promise(console.log("_________in promise___________"))属于错误写法:.promise()方法不接收任何参数,这里的console.log会在调用.promise()时同步执行,不是请求的回调逻辑。
修复方案
二选一即可,不要混用两种异步处理方式:
方案1:仅使用回调方式
去掉await和.promise()调用:
console.log('_________CALL_______________'); console.log("_________in promise___________"); sqs.sendMessage(params, function(err, data) { if (err) { console.log("Error", err); } else { console.log("Success", data.MessageId ,data); } console.log("___end") });
方案2:仅使用async/await + Promise方式(更推荐)
去掉sendMessage的回调参数,把结果处理逻辑放到await之后:
console.log('_________CALL_______________'); console.log("_________in promise___________"); try { const r = await sqs.sendMessage(params).promise(); console.log("Success", r.MessageId ,r); } catch (err) { console.log("Error", err); } console.log("___end")
内容的提问来源于stack exchange,提问作者jchenaud
相关产品推荐
相关产品推荐

