aws sqs 消息一直消失
aws sqs messages consistently disappear
获得了 3 个 SQS 队列和 3 个 lambda。 Lambda1 向 queue1 发送 50 条消息,lambda2 从 queue1 获取一条消息并发送到 queue2,lambda3 从 queue2 获取并转发到 queue3。通过 cdk 定义的队列:
const stageOneQ = new sqs.Queue(this, "StageOne", {
fifo: true,
queueName: "StageOne.fifo",
});
const stageTwoQ = new sqs.Queue(this, "StageTwo", {
fifo: true,
queueName: "StageTwo.fifo",
});
const stageThreeQ = new sqs.Queue(this, "StageThree", {
fifo: true,
queueName: "StageThree.fifo",
});
与 lambdas 相同,例如:
const stageOneHandler = new lambda.Function(this, "stageOneHandler", {
runtime: lambda.Runtime.NODEJS_10_X,
code: lambda.Code.fromAsset("resources"),
handler: "stage-one-handler.handler",
timeout: Duration.seconds(30),
environment: {
stageTwoQ: stageTwoQ.queueUrl
}
});
队列设置为 lambda2 和 3 个事件源,例如:
stageOneHandler.addEventSource(new SqsEventSource(stageOneQ));
并且在 lambda 事件中找到消息:
exports.handler = async function(event, context) {
console.log(`Received: ${event.Records[0].body}`);
.....
lambdas 像这样发送消息(profile.email 是唯一的):
await sqs.sendMessage({
MessageBody: message,
MessageGroupId: "group1",
MessageDeduplicationId: profile.email,
QueueUrl: queueUrl
}).promise();
queue1 按预期收到 50 条消息,但 queue2 收到 18 到 26 条消息,而 queue3 收到大约 6 条或 12 条消息。如果 lambda1 以 1 秒的间隔发送 50 条消息,则所有消息都会传送到所有队列。当间隔减少到 100 毫秒或更短时,一些消息消失得无影无踪,发送但从未收到。为什么?! AWS SQS.. 不好吗?尝试了基于内容的重复数据删除,没有帮助。
在此代码中:
console.log(`Received: ${event.Records[0].body}`);
您只记录了列表中的第一条记录。 event.Records
是一个数组。您需要遍历该数组并处理其中的所有记录。默认情况下,Lambda SQS 集成将一次最多分批发送 10 条记录。您必须用 1
的值覆盖 Lambda/SQS integration batch size setting 才能一次只收到一条消息。
获得了 3 个 SQS 队列和 3 个 lambda。 Lambda1 向 queue1 发送 50 条消息,lambda2 从 queue1 获取一条消息并发送到 queue2,lambda3 从 queue2 获取并转发到 queue3。通过 cdk 定义的队列:
const stageOneQ = new sqs.Queue(this, "StageOne", {
fifo: true,
queueName: "StageOne.fifo",
});
const stageTwoQ = new sqs.Queue(this, "StageTwo", {
fifo: true,
queueName: "StageTwo.fifo",
});
const stageThreeQ = new sqs.Queue(this, "StageThree", {
fifo: true,
queueName: "StageThree.fifo",
});
与 lambdas 相同,例如:
const stageOneHandler = new lambda.Function(this, "stageOneHandler", {
runtime: lambda.Runtime.NODEJS_10_X,
code: lambda.Code.fromAsset("resources"),
handler: "stage-one-handler.handler",
timeout: Duration.seconds(30),
environment: {
stageTwoQ: stageTwoQ.queueUrl
}
});
队列设置为 lambda2 和 3 个事件源,例如:
stageOneHandler.addEventSource(new SqsEventSource(stageOneQ));
并且在 lambda 事件中找到消息:
exports.handler = async function(event, context) {
console.log(`Received: ${event.Records[0].body}`);
.....
lambdas 像这样发送消息(profile.email 是唯一的):
await sqs.sendMessage({
MessageBody: message,
MessageGroupId: "group1",
MessageDeduplicationId: profile.email,
QueueUrl: queueUrl
}).promise();
queue1 按预期收到 50 条消息,但 queue2 收到 18 到 26 条消息,而 queue3 收到大约 6 条或 12 条消息。如果 lambda1 以 1 秒的间隔发送 50 条消息,则所有消息都会传送到所有队列。当间隔减少到 100 毫秒或更短时,一些消息消失得无影无踪,发送但从未收到。为什么?! AWS SQS.. 不好吗?尝试了基于内容的重复数据删除,没有帮助。
在此代码中:
console.log(`Received: ${event.Records[0].body}`);
您只记录了列表中的第一条记录。 event.Records
是一个数组。您需要遍历该数组并处理其中的所有记录。默认情况下,Lambda SQS 集成将一次最多分批发送 10 条记录。您必须用 1
的值覆盖 Lambda/SQS integration batch size setting 才能一次只收到一条消息。