[英]Get all message from aws sqs
我每 24 小时在我的lamda function
上有一个ScheduledEvent
,然后在 function 内,我打电话给SQS
来获取我的消息。
export class EmailNotificationProcessor {
public static async run(): Promise<void> {
console.log('event');
await this.getNotificationFromSqs();
}
private static async getNotificationFromSqs(): Promise<void> {
const messagesToDelete: DeleteMessageBatchRequestEntryList = [];
const messageRequest: ReceiveMessageRequest = {
QueueUrl: process.env.DID_NOTIFICATION_SQS_QUEUE,
MaxNumberOfMessages:10,
WaitTimeSeconds:20
}
const { Messages }: ReceiveMessageResult = await receiveMessage(messageRequest);
console.log('Messages', Messages);
console.log('Total Messages ', Messages.length);
if (Messages && Messages.length > 0) {
for (const message of Messages) {
console.log('body is ', message.Body);
messagesToDelete.push({
Id: message.MessageId,
ReceiptHandle: message.ReceiptHandle,
} as DeleteMessageBatchRequestEntry);
}
}
await deleteMessages(messagesToDelete);
}
}
我预计队列中有 1 到 30 条消息,并希望在发送 email 之前处理所有消息,其中包含我将从sqs body
解析的内容。
我的 function 用于接收消息
export const receiveMessage = async (request: SQS.ReceiveMessageRequest): Promise<PromiseResult<SQS.ReceiveMessageResult, AWSError>> =>{
console.log('inside receive');
return sqs.receiveMessage(request).promise();
}
现在我无法一次收到所有消息,一次只能收到 3 条消息,有时甚至 1 条消息。
我知道 API 调用的限制是一个请求中的 10 个,但是有什么方法可以等待并获取您的所有消息。
首先,没有配置可以从队列中获取超过 10 条消息。
ReceiveMessage:从指定队列中检索一条或多条消息(最多 10 条)
对于您的其他问题:我认为您正在使用短轮询ReceiveMessage 调用。如果队列中的消息数量非常少,您可能不会在特定的 ReceiveMessage 响应中收到任何消息。
尝试长轮询:长轮询通过消除空响应(当没有可用于 ReceiveMessage 请求的消息时)和错误空响应(当消息可用但未包含在响应中时)的数量来帮助降低使用 Amazon SQS 的成本)。
注意* 要获得更多消息,您需要将 SQS 调用包装在一个循环中,并继续请求更多消息,直到队列为空,这也会导致您获得重复消息,因此请在该问题中尝试 VisibilityTimeout。
尝试 VisibilityTimeout:接收到的消息在被 ReceiveMessage 请求检索后对后续检索请求隐藏的持续时间(以秒为单位)。
示例总结 SQS 调用代码:
function getMessages(params, count = 0, callback) {
let allMessages = [];
sqs.receiveMessage(params, function (err, data) {
if (err || (data && !data.Messages || data.Messages.length <= 0)) {
if(++count >= config.SQSRetries ){
return callback(null, allMessages);
}
return setTimeout(() => {
return getMessages(params, count, callback);
}, 500);
} else if (++count !== config.SQSRetries ){
allMessages.push(data);
return setTimeout(() => {
return getMessages(params, count, callback);
}, 500);
} else {
allMessages.push(data);
callback(null, allMessages);
}
});
在config.SQSRetries中,我们根据我们的要求设置了值,但是由于您的 SQS 有 1 到 30 条消息,那么“7”对您有好处!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.