【问题标题】:AWS SQS standard queue or FIFO queue when message can not be duplicated?无法复制消息时的AWS SQS标准队列或FIFO队列?
【发布时间】:2017-09-26 16:28:41
【问题描述】:

我们计划使用 AWS SQS 服务对从 Web 服务创建的事件进行排队,然后使用多个工作器来处理这些事件。一个事件只能处理一次。根据 AWS SQS 文档,AWS SQS 标准队列可以“偶尔”产生重复的消息,但吞吐量不受限制。 AWS SQS FIFO 队列不会产生重复的消息,但吞吐量限制为每秒 300 个 API 调用(batchSize=10,相当于每秒 3000 条消息)。我们目前的高峰时段流量仅为每秒 80 条消息。因此,就吞吐量要求而言,两者都很好。但是,当我开始使用 AWS SQS FIFO 队列时,我发现我需要做一些额外的工作,比如提供额外的参数 “MessageGroupId”和“MessageDeduplicationId”或需要启用“ContentBasedDeduplication”设置。所以,我不确定哪个是更好的解决方案。我们只需要不重复的消息。我们不需要消息是先进先出的。

解决方案 #1: 使用 AWS SQS FIFO 队列。对于每条消息,需要为“MessageGroupId”和“MessageDeduplicationId”参数生成一个UUID。

解决方案 #2: 使用启用了“ContentBasedDeduplcation”的 AWS SQS FIFO 队列。对于每条消息,需要为“MessageGroupId”生成一个UUID。

解决方案 #3: 将 AWS SQS 标准队列与 AWS ElasticCache(Redis 或 Memcached)结合使用。对于每条消息,“MessageId”字段将保存在缓存服务器中并稍后检查是否重复。存在意味着此消息已被处理。 (顺便说一句,“MessageId”应该在缓存服务器中存在多长时间。AWS SQS 文档没有提到消息可以复制多远。)

【问题讨论】:

  • 我不确定这些是否“更好”。最简单的肯定是使用启用 ContentBasedDeduplcation 的 FIFO 队列。选择您最满意的解决方案。
  • 具有 FIFO 的 SQS 保证在特定时间范围内(可能 5 分钟)内没有重复消息,因此如果有重复条目出现,您将收到重复消息。所以你需要通过设计来解决这个问题。
  • 生产者(网络服务)通常在几百毫秒内完成。那么,5分钟就够了吗?基本上,我想看看在我们的代码逻辑/缓存服务器中执行“重复数据删除”还是依靠 FIFO 队列更好?
  • 在非 FIFO 队列中多次传递消息的异常情况下,ReceiptHandle 几乎肯定相同,但 MessageId 将是一样。
  • 参见my answer to this related question -- “您要求保证 - 您不会得到保证。您可以将消息被多次处理的可能性降低到非常小的数量,但是您不会得到保证。”,以及您可以做什么的详细说明。希望对您有所帮助。

标签: amazon-web-services queue message-queue amazon-sqs


【解决方案1】:

您正在使用 SQS 使您的系统变得复杂。

我们已迁移到 Kinesis Streams,它可以完美运行。以下是我们看到的好处,

  1. 事件顺序
  2. 当数据出现在流中时触发事件
  3. 分批发货
  4. 将处理错误的责任留给接收方
  5. 如果出现问题,请及时返回 Buggier 流程​​的实施
  6. 比 SQS 性能更高

希望对你有帮助。

【讨论】:

  • 感谢您的快速回复。 Kinesis Streams 似乎很有趣。但是,在我们的简单案例中,我们只是使用 SQS 作为离线批处理的缓冲区,因为我们无法尽快处理所有请求(有几个 3rd 方 api 调用)。对于简单的用例和成本,SQS 似乎更适合link。此外,Kinesis 也有重复记录问题link
【解决方案2】:
  • 我的第一个问题是,为什么不收到重复消息如此重要?一个理想的解决方案是使用标准队列并将您的工作人员设计为幂等的。例如,如果消息包含类似任务 ID 之类的内容,并将已完成任务的结果存储在数据库中,则忽略那些任务 ID 已存在于数据库中的消息。
  • 不要使用收据句柄来处理应用程序端的重复数据删除,因为每次收到消息时它们都会改变。换句话说,SQS 不保证重复消息的收据句柄相同。
  • 如果您坚持重复数据删除,那么您必须使用 FIFO 队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2017-04-12
    • 2019-04-11
    相关资源
    最近更新 更多