Go语言Lambda函数如何处理SQS与Dynamo Stream两种触发事件?
针对Lambda处理多源事件的问题解答
问题1:能否通过if-else将不同事件导向专属处理函数?
完全可以。你可以在统一的handler里通过识别事件的特征字段判断来源,再分发到对应的处理函数。
Lambda触发的事件会在Records数组的单个元素中携带eventSource字段,可用来区分:
- SQS事件的
eventSource值为aws:sqs - DynamoDB Stream事件的
eventSource值为aws:dynamodb
示例代码:
// 专属SQS事件处理函数 const handleSQS = async (event) => { for (const record of event.Records) { const messageBody = JSON.parse(record.body); console.log("处理SQS消息:", messageBody); // 执行对应业务逻辑 } }; // 专属DynamoDB Stream事件处理函数 const handleDynamoStream = async (event) => { for (const record of event.Records) { const eventName = record.eventName; const newImage = record.dynamodb.NewImage; console.log(`处理Dynamo ${eventName}事件`, newImage); // 执行对应业务逻辑 } }; // 统一入口handler exports.handler = async (event) => { if (event.Records?.[0]?.eventSource === 'aws:sqs') { await handleSQS(event); } else if (event.Records?.[0]?.eventSource === 'aws:dynamodb') { await handleDynamoStream(event); } else { throw new Error("不支持的事件来源"); } };
这种方式适合逻辑关联度较高的场景,代码维护相对集中。
问题2:单个Lambda是否可包含两个分别处理不同事件的处理器?
当然可以。Lambda允许在同一个代码包中定义多个handler函数,之后在触发配置时指定不同的handler入口路径即可。
比如在同一个代码文件(如index.js)中定义两个独立处理器:
// SQS专属处理器 exports.sqsHandler = async (event) => { console.log("SQS处理器收到事件:", event); // 执行SQS相关业务逻辑 }; // DynamoDB Stream专属处理器 exports.dynamoHandler = async (event) => { console.log("Dynamo处理器收到事件:", event); // 执行Dynamo流相关业务逻辑 };
部署Lambda后,分别配置触发源:
- 给SQS触发器指定handler为
index.sqsHandler - 给DynamoDB Stream触发器指定handler为
index.dynamoHandler
这种方式的优势是两个处理器完全独立,逻辑划分更清晰,避免了分支判断带来的复杂度,适合业务逻辑差异较大的场景。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

