如何使用 AmazonSQSExtendedClient 从 SQS 事件接收数据

How to use AmazonSQSExtendedClient to recieve data from an SQSEvent

我有两个 AWS lambda 函数通过 SQS 队列连接在一起。它们已经正常工作了一段时间,但最近有效负载的大小有所增加,现在已经突破了 256Kb 的限制。

阅读 like to use the AmazonSQSExtendedClient. I've looked at the code at github 并使我的第一个 lambda 函数正确发送消息后(小负载通过 SQS,大负载写入 S3)。

我遇到的问题是接收消息:我的第二个 lambda 的入口点如下所示:

public class SqsHandler implements RequestHandler<SQSEvent, Void> {

  public Void handleRequest(SQSEvent event, Context context) {
    SQSEvent.SQSMessage record = event.getRecords().get(0);

    System.out.println("0. record " + record.toString());
    System.out.println("1. eventSource " + record.getEventSource());
    System.out.println("2. eventSourceARN " + record.getEventSourceArn());
    System.out.println("3. MessageId"  + record.getMessageId());
    System.out.println("4. ReceiptHandle " + record.getReceiptHandle());
    System.out.println("5. Body " + record.getBody());
  }
}

当我的入口点被调用时,我已经收到了我的 SQS 事件。我不知道(也不应该?)知道它来自队列。

GitHub 上的代码示例(几乎逐行复制到所有其他站点)发送方和接收方都是相同的 lambda。因此它能够创建 ReceiveMessageRequest 对象,因为它知道队列 URL。

在真实系统中,发送者和接收者永远不会相同。我什至可以通过多个队列接收来自多个 Lambda 的数据

我不明白的是接收Lambda应该怎么写。 AWS Website 上的示例代码说:

final ReceiveMessageRequest receiveMessageRequest =
        new ReceiveMessageRequest(myQueueUrl);
List<Message> messages = sqsExtended
        .receiveMessage(receiveMessageRequest).getMessages();

但这需要我知道队列的url。它也不绑定到需要消耗的 SQSEvent。

负载超过 256KB 的 SQSEvent 记录的消息正文应包含一个 JSON 字符串,表示一个 S3 指针,该指针由存储实际负载的 s3BucketName 和 s3Key 属性组成。请参阅 MessageS3Pointer class definition and storeMessageInS3 method of the AmazonSQSExtendedClient class 以供参考。使用此信息,您应该能够直接从 S3 获取消息内容,而无需依赖 Lambda 事件处理程序中的 SQS 扩展客户端库。

在接收器中,替换

for( var rec in event.Records ){
    const msg = JSON.parse( event.Records[rec].body );

for( var rec in event.Records ){
    const s = await s3.getObject({Bucket:process.env.SQS_BODY_BUCKET,Key:event.Records[rec].body}).promise();
    const msg = JSON.parse( s.Body );