首页 > 解决方案 > 向 Amazon SQS 发送大量消息

问题描述

我有一个 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 中。但是在某些公司工作的人数可能很大,因此Company由于 SQS 施加了 256kb 的消息大小限制,因此无法将整体插入 SQS。
所以现在我正在对 API 进行更改,而不是将 a 插入Company到 SQS 中,它应该插入一个Person并且消费者将处理Company-Person关系。示例:如果具有CompanyId: 1 的公司有 1000 人,则 API 将向 SQS 插入 100 条消息(每人一条消息,并且每个人的 CompanyId 属性设置为 1)。
这对于序列化后大于 256kb 的公司来说似乎很好,但对于序列化后小于 256kb 大小限制的公司来说效率很低。

问题:我应该如何有效地处理各种规模的公司(处理json序列化后生产小于 256kb 的公司以及序列化后生产大于 256kb 的公司json)。

注意:我知道有一个支持高达 2GB SQS 消息大小的 java 库,但我无法从 AWS找到任何可以处理这种情况的等效官方 .NET 库。

标签: c#.netamazon-web-servicesamazon-sqs

解决方案


我相信用于处理较大 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 下载它。


推荐阅读