是什么导致并行 SQS 交付的高延迟?

What causes high latency of parallel SQS delivery?

使用 Node SDK,当在多个队列上并行发送消息时,我发现传递 SQS 消息的延迟大约为 9000 毫秒。如果我在一个队列中按顺序发送所有消息,我将获得大约 300 毫秒的低得多的延迟。在这两个测试中,使用以下代码以 10 条为一组发送消息。发送时间戳放在消息本身中,因此我可以测量收到消息时的传递时间。

为什么在并行队列中发送的消息传输速度这么慢?亚马逊是否进行速率限制?

      for (i = 0; i < 10; i++) {
        var entry = {
          Id: String(messageCount),
          MessageBody: "test"+messageCount+(new Date().getTime()),
          MessageDeduplicationId: "test"+messagecount+" "+(new Date().getTime())
        };
        entries.push(entry);
        messageCount += 1;
      }
      var params = {
        QueueUrl: queueUrls[senderIndex],
        Entries: entries
      };
      sqs.sendMessageBatch(params, function(batchSendErr, results) {
              ...
      });

在顺序情况下,我 运行 一个节点程序在单个队列上发送 500 批 10 条消息,一个程序接收 500 批 10 条消息。 (总共 500 条消息。)

在并行情况下,我 运行 一个节点程序创建 250 个编写器线程,并将两批 10 条消息从每批发送到 250 个不同队列中的一个。我 运行 另一个节点程序创建了 250 个 reader 线程并从每个线程接收两批 10 条消息。 (总共 5000 条消息)

对于上面的测试,我使用了 FIFO 队列,尽管结果与非 FIFO 队列相似。

我确实注意到,在并行发送的情况下,对 AWS SDK 的每次批量发送调用大约需要 5 秒才能获得完成回调。在连续的情况下,每个批量发送调用 AWS SDK 大约需要 300 毫秒。我不确定为什么 API 并行调用速度较慢,除非 AWS 限制我的调用速率。

顺便说一句,这是我的队列设置。这些队列中有 250 个,#{item} 范围从 1 到 250

aws sqs create-queue --queue-name loadtest_device#{item}_user#{item}.fifo --attributes "FifoQueue=true,VisibilityTimeout=300,ReceiveMessageWaitTimeSeconds=0"

在与亚马逊支持工程师讨论此问题后,他表示无法重现结果。他的理论是延迟问题是由网络瓶颈引起的,特别是 WiFi 流量拥塞,因为两个测试网络都使用相同的 WiFi 无线电space。

我无法完全确认,因为我无法访问两个独立的有线网络连接。我确实见证了 SQS 发送操作具有大而冗长的数据负载,并且确实使用了比其他操作高得多的带宽(2 倍数据开销大小与 lambda 调用。)这与网络瓶颈理论一致。