我有一个包含数千条消息的 SQS 队列。由于函数的大小(使用 puppeteer),我无法在 lambda 上使用它们,因此我已将消费者转移到 EC2 实例。由于这是 POC,我使用这个 (https://github.com/bbc/sqs-consumer) 库对消费者进行了非常基本的实现,并使用
pm2
多次启动了相同的流程。
import { SQSClient } from '@aws-sdk/client-sqs';
import { Consumer } from 'sqs-consumer';
const sqs = new SQSClient({
apiVersion: '2012-11-05',
region: 'us-east-1',
credentials: {
accessKeyId: #@@@#
secretAccessKey: 232131321312
},
});
const app = Consumer.create({
queueUrl: EnvsEnum.QUEUE_URL,
terminateVisibilityTimeout: true,
waitTimeSeconds: 20,
handleMessage: async (message) => {
... my handler here doing some work on the message
},
shouldDeleteMessages: true,
region: 'us-east-1',
sqs,
});
app.on('error', (err, item) => {
...
});
app.on('processing_error', (err) => {
...
});
console.log('starting app...');
app.start();
我预计会在飞行中看到多条消息,但在 SQS 仪表板上我只经常看到 1 条消息。可能是什么原因?如果我的做法完全错误,也许有一些很好的指南来实现适当的消费者?
更新
我通过意识到我正在向队列发送相同的 MessageGroupId 来解决问题 - 修复使消费者按预期并行工作。
登录只是为了表示感谢:)遇到了完全相同的问题