向 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 发送大量消息的主要内容,如果未能解决你的问题,请参考以下文章

Amazon SQS 消息队列服务

如何将Amazon SQS与Dynamodb集成

Amazon SQS 消息多路传送

Amazon SQS/SNS 策略错误

AWS SQS FIFO或AWS DynamoDB用于处理大量消息

在发送到 SNS 之前,我可以使用 Amazon SQS 作为延迟队列吗?