【问题标题】:Managing large AWS SQS payloads over S3通过 S3 管理大型 AWS SQS 有效负载
【发布时间】:2022-06-16 00:43:40
【问题描述】:

我正在一个项目 Java 11/Spring boot 项目中工作,我需要发送和使用超过 256KB 的 SQS 消息,这是 SQS 的常见限制。我无法以消息小于 256KB 的方式更改系统建模。

我知道 AWS 通过使用其 SQS 扩展客户端库来支持更大的负载,可以在这里看到:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-s3-messages.html#working-java-example-using-s3-for-large-sqs-messages-example

我复制并测试了发送消息的示例,但仍然不确定他在 Spring Boot 集成 (@SqsListener) 上使用此类消息的行为。该代码成功运行,但我不确定有效负载是否已在使用后在 S3 存储桶中被删除,因为我看不到消息存储在其中。示例中,删除消息需要手动完成,但我在运行代码时并没有编码。

Spring Boot @SqsListener 消费者是否已经设法在消费后删除消息,并使一切准备就绪,还是我需要管理一些东西?

【问题讨论】:

  • 我猜客户端不会负责从 S3 中删除消息 - 它会从 SQS 中删除它们,但不会从 S3 中删除。这就是为什么在您的链接帖子中有 BucketLifecycleConfiguration 的原因,该政策负责在 14 天后删除 S3 中的消息。

标签: java amazon-web-services spring-boot amazon-s3 amazon-sqs


【解决方案1】:

我通过调试 aws sdk 代码找到了答案。我会把它放在这里,供以后需要的人使用。

我最初认为消息足够大,因为我认为 char 的编码每个 char 占用 2 个字节,但通过分析方法,从 aws Util.getStringSizeInBytes 开始,它只占用 1 个字节。

如果您检查来自 AmazonSQSExtendedClient.sendMessage 的代码,您会看到会有这样的比较:

                if (this.clientConfiguration.isAlwaysThroughS3() || this.isLarge(sendMessageRequest)) {
                sendMessageRequest = this.storeMessageInS3(sendMessageRequest);
            }

然后我看到 this.isLarge 和 isAlwaysThroughS3 都是假的,所以它根本没有真正使用 S3 存储桶。然后,为了测试,我增加了有效负载,直到 isLarge 更改为 true,然后我可以在 S3 存储桶中看到消息。

还有一个很好的提示,即当 S3 正在使用时,消息仅在 SQS 上发送 S3 密钥。

【讨论】:

    猜你喜欢
    • 2018-03-08
    • 2018-01-07
    • 2020-06-04
    • 1970-01-01
    • 2018-12-28
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多