Улучшение производительности Amazon SQS - PullRequest
1 голос
/ 22 января 2020

Все, что я могу найти о производительности Amazon Simple Queue Service (SQS), включая их собственную документацию, предполагает, что для получения высокой пропускной способности требуется несколько потоков. И я сам проверил это, используя JS API с Node 12. Если я создаю несколько потоков, я получаю примерно одинаковую пропускную способность в каждом потоке, поэтому общее увеличение пропускной способности в значительной степени линейно. Но я запускаю это на хорошей машине с большим количеством ядер. Когда я работаю в Lambda на одном ядре, несколько потоков не улучшают производительность, и, как правило, это то, что я ожидаю от многопоточных приложений.

Но вот что я не понимаю - должно быть здесь очень мало внимания уделяется процессорам, большая часть времени уходит на ожидание веб-запросов. API AWS SQS выглядит асинхронным в том смысле, что все методы используют обратные вызовы для ответов, а я использую Promises для «асинхронизации» всех вызовов API, при этом несколько задач выполняются одновременно. Обычно выполнение этого с любым асинхронным c IO отлично обрабатывается Node и значительно повышает пропускную способность, я делаю это все время с API-интерфейсами баз данных, несколькими потоками и т. Д. c. Но SQS определенно не ведет себя таким образом, он ведет себя так, как будто его IO на самом деле является синхронным и блокирует потоки сетевых вызовов, что было бы возмутительно для любого современного API. пропускная способность в одном потоке Node? Максимум, который я вижу, составляет от 50 до 100 сообщений / с c для очередей FIFO (отправка, получение и удаление, все из которых вызывают методы пакета с максимальным размером пакета 10). И это работает в лямбде, то есть в их собственной сети, что лишь немного быстрее, чем запускать его на моем ноутбуке через Inte rnet, еще одна удивительная находка. В документации Amazon говорится, что очереди FIFO должны поддерживать до 3000 сообщений в секунду при пакетной обработке, что было бы просто замечательно для меня. Действительно ли для этого требуется несколько потоков на нескольких ядрах или виртуальных процессорах? Это было бы смешно, я просто не могу поверить, что будет использоваться много ЦП, это должно быть в основном время ввода-вывода, которое должно быть асинхронным.

Редактировать:

Продолжая тестирование, я обнаружил, что линейное улучшение числа потоков происходит только тогда, когда каждый поток обрабатывает свою очередь. Если все потоки обрабатывают одну и ту же очередь, улучшения не добавляются. Таким образом, он ведет себя так, как будто каждая очередь задушена Amazon. Но пропускная способность, на которую он, похоже, падает, намного ниже того, что я обнаружил задокументированным как максимальная производительность. Действительно растерян и разочарован прямо сейчас!

1 Ответ

0 голосов
/ 23 января 2020

Комментарии Майкла к первоначальному вопросу были правильными. Я отправлял все сообщения в одну группу сообщений. Ранее я работал с очередями сообщений AMQP, в которых сообщения будут упорядочены в очереди в том порядке, в котором они были отправлены, и они будут распространяться среди подписчиков в этом порядке. Но когда несколько слушателей используют очередь AMQP из-за различий в сетевых задержках, нет никакой гарантии, что они будут получены в этом порядке в хронологическом порядке.

Так что это действительно классная особенность SQS, гарантия того, что сообщения будут приниматься в хронологическом порядке в том порядке, в котором они были отправлены в пределах одной группы сообщений. В моем случае мне нет дела до получения заказа. Итак, теперь я устанавливаю уникальный идентификатор группы сообщений для каждого сообщения и увеличиваю производительность за счет увеличения числа асинхронных циклов приема сообщений c, все еще только в одном потоке, и пропускная способность потрясающая!

Таким образом, нижняя строка : Если точный порядок получения сообщений не важен для вашей очереди FIFO, задайте для идентификатора группы сообщений уникальное значение в каждом сообщении и масштабируйте его с помощью большего числа задач получателя, чтобы получить лучшее производительность Если вам нужен гарантированный порядок сообщений, похоже, что около 50 сообщений в секунду - это лучшее, что вы будете делать.

...