为 SQS FIFO 队列实现高吞吐量的分区和数据分配 - Amazon Simple Queue Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为 SQS FIFO 队列实现高吞吐量的分区和数据分配

Amazon SQS 将 FIFO 队列数据存储在分区中。一个分割是为队列分配的存储,队列在Amazon区域。您不管理分区。相反,Amazon SQS 处理分区管理。

对于 FIFO 队列,在以下情况下,Amazon SQS 会修改队列中的分区数量:

  • 如果当前的请求速率接近或超过现有分区可支持的速度,则会分配额外的分区,直到队列达到区域配额为止。有关配额的信息,请参阅与消息相关的配额.

  • 如果当前分区的利用率较低,则分区的数量可能会减少。

分区管理在后台自动进行,对程序是透明的。您的队列和消息始终可用。

按消息组 ID 分发数据

要向 FIFO 队列添加消息,Amazon SQS 使用每条消息的消息组 ID 的值作为内部哈希函数的输入。散列函数的输出值决定了哪个分区存储消息。

下图显示了跨多个分区的队列。队列的消息组 ID 基于项目编号。Amazon SQS 使用其哈希函数决定新项目的存储位置;在这种情况下,它将基于字符串的哈希值。item0. 请注意,这些项目的存储顺序与添加到队列的顺序相同。每个项目的位置由其消息组 ID 的哈希值决定。


      一个队列跨越多个分区。
注意

Amazon SQS 经过优化,不论分区数如何,都可在 FIFO 队列的分区上统一分配项目。Amazon建议您使用具有大量不同值的消息组 ID。

优化分区利用率

每个分区每秒支持最多 3000 条消息(带有批处理)或者每秒支持最多 300 条消息用于发送、接收和删除操作。

使用批处理 API 时,每条消息都会根据中所述的流程进行路由按消息组 ID 分发数据 . 路由到同一个分区的消息在单个事务中进行分组和处理。

优化分区利用率SendMessageBatchAPI,Amazon建议尽可能使用相同消息组 ID 批处理消息组 ID。

优化分区利用率DeleteMessageBatchChangeMessageVisibilityBatchAPI,Amazon建议使用ReceiveMessage使用的请求MaxNumberOfMessages参数设置为 10,并对单个返回的收据句柄进行批处理ReceiveMessage请求.

在以下示例中,发送了一批具有各种消息组 ID 的消息。该批次分为三组,每组都计入分区的配额。


        一批具有不同消息组 ID 的消息存储在分区中。
注意

Amazon SQS 仅保证具有相同消息组 ID 的消息在批处理请求中分组。根据内部哈希函数的输出和分区数量,可能会对具有不同消息组 ID 的消息进行分组。由于哈希函数或分区数量可能随时更改,因此以后可能不会对某一点进行分组的消息进行分组。