2015-05-22 1 views
0

Я чувствую, что этот вопрос был задан раньше, но я не могу его найти. Простите меня, если это повторение.Check queued reads/write for MongoDB

Я строю службу на Node.js, размещенной в Heroku, и используя MongoDB, размещенную на Compose. При большой нагрузке латентность, скорее всего, будет поступать из базы данных, так как на уровне обслуживания нет ничего очень тяжелого процессора. Таким образом, когда MongoDB перегружен, я хочу быстро вернуть HTTP 503, а не ждать таймаута.

Я также использую REDIS, а REDIS имеет функцию, в которой вы можете проверить количество команд в очереди (redisClient.command_queue.length). С помощью этой функции я могу сразу узнать, поддерживается ли REDIS. Есть ли что-то подобное для MongoDB?

Наилучший вариант, который я нашел до сих пор, - это опрос сервера для статуса через this command, но (1) Я надеюсь на что-то клиентскую сторону, так как могут быть всплески в пределах интервала опроса, которые вызывают проблемы, и (2) Я на самом деле не уверен, в какой части ответа на статус я хочу действовать. Эта вторая часть приводит меня к следующему вопросу ...

Я не совсем понимаю, как клиент MondoDB работает с сервером. Является ли одно соединение общим для каждого экземпляра клиента (и в моем случае, за процесс)? Запросы и записи в очереди локально или на сервере? Или одно соединение открыто для каждого запроса/записи, пока пул соединений базы данных не исчерпан? Если это так, кажется, я хочу следить за открытыми соединениями. Предоставляет ли сервер MongoDB такую ​​информацию в другое время, кроме того, когда вы опросили статус?

Спасибо!

ответ

1

MongoDB пула соединений Workflow-

Каждый MongoClient экземпляр имеет встроенный пул соединений. Клиент по требованию открывает сокеты, чтобы поддерживать количество одновременных операций MongoDB, требуемых вашим приложением. Для сокетов нет нитей.

Клиентский экземпляр открывает один дополнительный сокет на сервер в вашей топологии MongoDB для контроля состояния сервера.

Размер каждого пула соединений ограничен в maxPoolSize, который по умолчанию 100.

Когда поток в приложении начинает операцию по MongoDB, если все остальные разъемы используются и бассейн достиг своего максимума , поток приостанавливается, ожидая, что сокет будет возвращен в пул другим потоком.

Вы можете увеличить maxPoolSize:

client = MongoClient(host, port, maxPoolSize=200) 

По умолчанию, любое количество потоков может ждать сокетов, чтобы стать доступными, и они могут ждать любой отрезок времени. Переопределить waitQueueMultiple, чтобы ограничить количество ожидающих потоков. Например., Чтобы сохранить количество официантов меньше или равно 500:

client = MongoClient(host, port, maxPoolSize=50, waitQueueMultiple=10) 

После бассейна достигает максимального размера, дополнительные потоки могут ждать до бесконечности для розетки, чтобы стать доступным, если вы установите waitQueueTimeoutMS:

client = MongoClient(host, port, waitQueueTimeoutMS=100) 

Ссылка для подключения pooling- http://blog.mongolab.com/2013/11/deep-dive-into-connection-pooling/

+0

Это только вид информации, которую я искал. Спасибо! –