java - 如何使用 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 相关联。
解决方案
有效负载超过 256KB 的 SQSEvent 记录的消息正文应包含一个 JSON 字符串,该字符串表示一个 S3 指针,该指针由存储实际有效负载的 s3BucketName 和 s3Key 属性组成。请参阅AmazonSQSExtendedClient类的MessageS3Pointer类定义和 storeMessageInS3 方法以供参考。有了这些信息,您应该能够直接从 S3 获取消息内容,而无需依赖 Lambda 事件处理程序中的 SQS 扩展客户端库。
推荐阅读
- spartacus-storefront - 从浏览器获取语言不适用于 SSR
- apache-kafka - kafka 决定是否压缩主题的所有步骤
- types - 如何扩展这种关于病毒传播的想法?
- apache-kafka - Kafka Connect 中的静态成员资格
- javascript - 在php中单击时如何使表格在javascript中做出反应?
- python - 如何在 django 中将值/变量从一个函数传递到另一个函数 - 视图
- serialization - 在 PySpark 中导出用于部署的数据模型 - 无法使用 Pickle 导出
- javascript - 滑块中的视频未播放
- windows - 无法运行或拉取 Windows docker 映像
- r - parLapply - 有没有办法在 R 中使用 parLapply 时返回哪个核心返回错误