Каков оптимальный размер пула для соединения Mongoose с Atlas MongoDB?
My Express REST API использует Mongoose с MongoDB Atlas. В Atlas работает M10s (EC2 T2 smalls), а мой REST API - на EC2 M5 Large. В настоящее время я использую параметр подключения mongoose "poolSize" как значение по умолчанию 5 (поэтому я думаю, что 15 общих открытых подключений к набору реплик).
Я хочу, чтобы мое приложение могло обрабатывать 1000 запросов/секунду для базы данных Atlas.
БД - это всего лишь базовая коллекция пользователей 50K, каждая из которых имеет пару точек данных, а также изображение профиля 10kb. 500 запросов будут для изображения профиля, а другая половина - для таких вещей, как имя пользователя и пароль.
Мой MongoDB Atlas replica set говорит, что он имеет максимум 350 подключений. Если я использую только 15 из них, я непреднамеренно создаю узкое место здесь? Смогут ли эти 15 соединений (5/узел) обрабатывать 1000 запросов в секунду? Должен ли я увеличить свой "poolSize" в Mongoose до 100 (300 общих подключений к набору реплик), чтобы разрешить больше запросов в секунду? Я понимаю, что простой ответ заключается в том, чтобы сказать, протестируйте его, но сначала я хотел бы услышать примерно то, что я должен был сделать в этой ситуации, и узнать, будет ли моя текущая настройка "poolSize" из 5, вероятно, прекрасной для 1000 запросов/с?
Ответы
Ответ 1
Я думаю, что эта ссылка здесь вам поможет: https://dzone.com/articles/how-to-use-mongodb-connection-pooling-on-aws-lambd
Один кусок полезной информации оттуда:
Размер пула соединений определяет максимальное количество параллельных запросов, которые ваш драйвер может обрабатывать в данный момент времени. Если достигнут лимит пула соединений, будут сделаны новые запросы, чтобы дождаться завершения существующих. Следовательно, размер пула должен быть выбран тщательно, учитывая загрузку приложения и параллелизм.
Как правило, низкий размер пула приведет к тому, что многие ваши запросы будут сидеть и ждать соединения, и это может привести к таймаутам с высокой нагрузкой.
Идем дальше и используем JMeter или другой инструмент, настроенный для выполнения параллельных запросов к вашему приложению, и посмотрите, какие запросы в секунду вы получаете по умолчанию 5 poolSize.
Обязательно настройте JMeter (или другой инструмент), чтобы иметь реалистичное количество одновременных пользователей и реалистичные запросы, которые отражают то, что вы увидите в процессе производства как можно больше. И создайте несколько разновидностей, таких как ситуации с низкой нагрузкой, средней нагрузкой и высокой нагрузкой.
Когда у вас есть базовый уровень с настройками по умолчанию, теперь вы можете увеличить пул и посмотреть, как реагирует RPS.
Также: следите за потреблением памяти с большими размерами пула, они едят ~ 1 мегабайт за соединение.
Такой эмпирический анализ, как правило, позволяет вам комфортно работать с вашими настройками.
Ответ 2
Максимальное количество сокетов, которое драйвер MongoDB будет держать открытым для этого соединения. По умолчанию poolSize равен 5. Имейте в виду, что с MongoDB 3.4 MongoDB разрешает только одну операцию на каждый сокет за раз, поэтому вам может понадобиться увеличить это, если вы обнаружите, что у вас есть несколько медленных запросов, которые блокируют более быстрые запросы от продолжение.
перейдите по этой ссылке: http://mongoosejs.com/docs/connections.html