向 Amazon SQS 发送大量消息
Posted
技术标签:
【中文标题】向 Amazon SQS 发送大量消息【英文标题】:Send huge message to Amazon SQS 【发布时间】:2021-11-20 13:50:03 【问题描述】:我有一个 API,它在 POST 请求中接收有效负载并将其插入到 Amazon SQS 队列中,以便其他服务可以使用该消息。基本思想是 API 需要快速将响应返回给调用者,并在稍后的某个时间继续进行繁重的处理。 POST 请求模型:
class Company
public int CompanyId get; set;
public List<Person> People get; set;
class Person
public int Id get; set;
public int CompanyId get; set;
public string FirstName get; set;
....
....
我最初的想法是将整个Company
插入SQS。但是在某些公司工作的人数可能很大,因此由于 SQS 规定的 256kb 消息大小限制,将整个 Company
插入 SQS 是不可能的。
所以现在我正在对 API 进行更改,以便将 Company
插入到 SQS 中,而不是插入一个 Person
并且消费者将处理 Company
-Person
关系。示例:如果CompanyId
: 1 的公司有 1000 人,则 API 将向 SQS 插入 100 条消息(每人一条消息,每个人的 CompanyId 属性设置为 1)。
这对于序列化后大于 256kb 的公司来说似乎很好,但对于序列化后小于 256kb 大小限制的公司来说效率非常低。
问题:我应该如何有效处理各种规模的公司(处理序列化后产生json
小于256kb 的公司以及产生json
大于256kb 的公司)序列化)。
注意:我知道有一个 Java 库支持高达 2GB SQS 消息大小,但我找不到任何等效的 AWS 的官方 .NET 库 可以处理这种情况。
【问题讨论】:
【参考方案1】:我相信用于处理较大 SQS 消息的官方库仅是 Java,但您可以相当轻松地重现其功能。以下是您需要在应用程序中实现的伪代码:
if (JSON size > 256kb)
push json to S3
send SQS message with S3 URL in it
else
send SQS message with JSON in it
那么接收消息的 SQS 客户端只需要检查 JSON 是否在消息中,或者是否需要从 S3 下载。
【讨论】:
【参考方案2】:我认为您在谈论 Java 的 Extended Client Library,它可以发送高达 2GB 的有效负载。
这个库所做的事情也可以很容易地在其他编程语言中实现。本质上,您将巨大的有效负载保存在 S3 存储桶中,并发送一条 SQS 消息,其中包含指向可以下载有效负载的位置的指针。
【讨论】:
以上是关于向 Amazon SQS 发送大量消息的主要内容,如果未能解决你的问题,请参考以下文章