首页 > 解决方案 > 如何使用 AmazonSQSExtendedClient 从 SQSEvent 接收数据

问题描述

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

阅读问题 43738341后,喜欢使用 AmazonSQSExtendedClient。我查看了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 网站上的示例代码说:

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

但这需要我知道队列的 url。它也不与需要使用的 SQSEvent 相关联。

标签: javaamazon-web-servicesaws-lambdaaws-sdk

解决方案


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


推荐阅读