【发布时间】:2018-06-27 23:35:32
【问题描述】:
所以我有 3 个 lambda,其中一个带有触发 lambda 的 API 事件,该 lambda 下拉大约 50,000 个对象并将它们全部推送到队列中。
第二个 lambda 从队列中读取,一次 10 个,循环 30 次 - 这意味着它读取、执行操作、调用第三个 lambda、返回 promise,然后再次读取 - 30 次,总共 300 次读取lambda 执行的时间
第三个 lambda 从队列中获取信息并用它到达另一个端点。
问题在于第二个 lambda...首先我调用一个函数,该函数返回队列中的消息数,如果它大于零,我会读取它们。但是,即使队列中有 20,000 条消息,它也经常会一无所获。我不知道为什么。
我将 WaitTimeSeconds 设置为 20 进行长轮询。任何帮助将不胜感激,文档声称我可以使用 FIFO 队列读取高达 3,000/秒的数据,但我无法获得接近该性能的任何地方。
代码如下:
exports.handler = (event, context, callback) => {
const sqs = new AWS.SQS({ region: process.env.AWS_REGION });
getMessageCount(sqs)
.then((messageCount) => {
if (messageCount > 0) {
mapSeries(range(0, 30), getMessages(sqs))
.then((messageRes) => {
callback(null, messageRes);
})
.catch(e => Promise.reject(e));
}
callback(null, 'No more messages');
})
.catch((e) => {
callback(e);
});
};
getMessageCount 调用sqs.getQueueAttributes 并返回一个接收消息数量的承诺。
mapSeries 允许循环在迭代之前等待先前的承诺被解析/拒绝,并且在每次迭代中它调用 getMessages 调用 sqs.receiveMessage 并使用数据调用第三个 lambda。
感谢您对此的任何看法,谢谢!
【问题讨论】:
标签: node.js amazon-web-services aws-lambda amazon-sqs