Устранение (долговременных) разрывов соединения в MongoDB

Я пишу веб-приложение, которое использует магазины. Если клиент не получает ответ в течение 30 секунд, он считает запрос мертвым и выдает ошибку тайм-аута.

Я пытаюсь заставить MongoDB делать то же самое. Если, например, соединение прервется на 1 минуту, драйвер попытается повторно подключиться и оставит запрос клиента висящим до тех пор, пока повторное соединение не будет успешным. Таким образом, такие вещи, как socketTimeoutMS (которые мне удалось заставить работать) здесь неэффективны.

Как лучше всего заставить MongoDB «отказаться» от запроса через N секунд?

Последнее, что я хочу, это дать клиенту ошибку тайм-аута, когда сервер фактически завершает запросы через 5 минут!


person Merc    schedule 05.10.2014    source источник


Ответы (1)


В версии 2.6 появилась опция 6.html#maxtimems" rel="nofollow">maxTimeMS:

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
    // Get an aggregation cursor
    var cursor = db.collection('data')
        .find("$where": "sleep(1000) || true")
        .maxTimeMS(50);

    // Get alll the items
    cursor.toArray(function(err, items) {
        console.dir(err);
        console.dir(items);
        db.close();
    });
});
person Artem    schedule 06.10.2014
comment
Но это означает, что мне придется применять его для каждого запроса, верно? Кроме того, сетевая задержка и время простоя курсора не учитываются в MaxTimeMS. -- и сетевая задержка - это то, что мне нужно... dba.stackexchange. com/questions/73939/mongodb-maxtimems-игнорированный - person Merc; 07.10.2014
comment
Любая идея о том, как использовать MaxTimeMS с функцией findOne? - person Adrian Toma; 17.06.2015