是什么导致并行 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 调用。)这与网络瓶颈理论一致。
使用 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 调用。)这与网络瓶颈理论一致。