【发布时间】:2019-05-25 03:03:04
【问题描述】:
我正在使用无服务器框架来使用来自 SQS 的消息。发送到队列的某些消息不会被消耗。他们直接进入飞行中的 SQS 状态,然后从那里进入我的死信队列。当我查看消费者的日志时,我可以看到它消费并成功处理了 9/10 消息。一个总是不被消耗并最终进入死信队列。我将reservedConcurrency 设置为1,以便一次只能运行一个消费者。函数使用者 timeout 设置为 30 秒。这是消费者代码:
module.exports.mySQSConsumer = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
console.log(event.Records);
await new Promise((res, rej) => {
setTimeout(() => {
res();
}, 100);
});
console.log('DONE');
return true;
}
消费者功能配置如下:
functions:
mySQSConsumer:
handler: handler.mySQSConsumer
timeout: 30 # seconds
reservedConcurrency: 1
events:
- sqs:
arn: arn:aws:sqs:us-east-1:xyz:my-test-queue
batchSize: 1
enabled: true
如果我删除await 函数,它将处理所有消息。如果我将超时时间增加到 200 毫秒,更多的消息将直接进入飞行状态,然后从那里进入死信队列。这段代码非常简单。任何想法为什么它会跳过一些消息?使用第一个 console.log() 语句,未使用的消息甚至不会显示在日志中。他们似乎完全被忽略了。
【问题讨论】:
标签: amazon-sqs serverless