Используя Node SDK, я вижу высокую задержку около 9000 мс для доставки сообщений SQS, когда сообщения отправляются параллельно в нескольких очередях. Если я отправляю все сообщения последовательно в одну очередь, у меня намного меньше задержка - около 300 мс. В обоих тестах сообщения отправляются партиями по 10, используя приведенный ниже код. Временная метка отправки помещается внутри самого сообщения, поэтому я могу измерить время доставки, когда сообщение получено.
Почему передача сообщений, отправляемых в параллельные очереди, происходит намного медленнее? Есть ли ограничение скорости у Amazon?
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 потоков чтения и получает две партии по 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"