【发布时间】:2022-01-20 05:39:44
【问题描述】:
这很可能是非常简单的事情,但由于某种原因,我的 SQS 消息在可见性超时后不再可用。至少这是我的想法,因为使用 lambda 没有任何日志条目表明已触发任何重试。
我的用例是另一个 lambda 为 SQS 队列提供 JSON 实体,然后需要转发。有时要发送的数据太多以至于接收端使用 HTTP 429 进行响应。
我发送的 lambda(通过 HTTPS 的 JSON 正文)仅在服务以 HTTP 200 响应时从队列中删除消息,否则我对 receiptHandle 什么都不做,我认为应该将消息保留在队列中。
无论如何,当请求被服务拒绝时,消息不再可用,因此它永远不会再次尝试发送并且永远丢失。
传入 SQS 已设置如下:
- 可见性超时:3 分钟
- 交货延迟:0s
- 接收消息等待时间:1s
- 消息保留期:1d
- 最大消息大小:256Kb
关联 DLQ 的最大接收数为 100
消费 lambda 配置为
- 内存:128Mb
- 超时:10 秒
- 触发器:源 SQS 队列,批处理大小:10,批处理窗口:无
我在 lambda 中的实际逻辑非常简单,真的。它接收的事件是队列中的Records。 Lambda 一次可能会获取多条记录,但所有记录都是单独处理的。
console.log('Response', response);
if (response.status === 'CREATED') {
/* some code here */
const deleteParams = {
QueueUrl: queueUrl, /* required */
ReceiptHandle: receiptHandle /* required */
};
console.log('Removing record from ', queueUrl, 'with params', deleteParams);
await sqs.deleteMessage(deleteParams).promise();
} else {
/* any record that ends up here, are never seen again :( */
console.log('Keeping record in', eventSourceARN);
}
做什么 :( ?!?!11
【问题讨论】:
标签: node.js amazon-web-services aws-lambda amazon-sqs