Как предотвратить огромные агрегатные запросы от сбоя MongoDB? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть экземпляр MongoDB, где иногда необходимо сделать неожиданные запросы.(В этом весь смысл без схемы, верно?)

Некоторые из них очень сложны и поэтому занимают много времени.Это нормально для меня, но я борюсь с тем, чтобы эти запросы приводили к сбою самой службы Mongod.

Я бы подумал, что естественным способом обработки этих случаев будет просто тайм-аут или отклонение запроса, но выглядит как Mongodпросто вылетает (ядро убивает процесс mongod с ошибкой OOM)

Это расстраивает, потому что это происходит без предупреждения.Мне известно, что MongoDB оставляет управление памятью для ОС, поэтому я запутался, почему он допускает сбои такого типа.

Есть ли простой способ справиться с ситуацией такого типа?

1 Ответ

0 голосов
/ 13 сентября 2018

Конечно. cursor.maxTimeMS () позволяет установить время ожидания для запроса. Если указанное время пройдет, запрос будет прерван.

Из документации

MongoDB нацеливает операции на завершение, если связанный курсор превышает выделенное время. MongoDB завершает операции, которые превышают выделенное время, используя тот же механизм, что и db.killOp (). MongoDB завершает операцию только в одной из назначенных ему точек прерывания.

MongoDB не считает сетевую задержку между клиентом и сервером по отношению к временному пределу курсора. Однако для сегментированного кластера MongoDB включает в себя задержку между экземплярами mongos и mongod к этому временному пределу.

Запросы, которые генерируют несколько пакетов результатов, продолжают возвращать пакеты до тех пор, пока курсор не превысит установленный лимит времени.

Использование

db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...