узел-mongodb-родной MongoClient неожиданно закрывает соединения

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

Я использую node-mongodb-native для подключения к БД, но я продолжаю получать, казалось бы, случайные сообщения "ошибка: соединение закрыто". Если я вручную повторяю запрос (обновление браузера), запрос работает.

есть идеи, что вызывает это? Есть какой-то простой вариант, который поможет?

мой дБ ручка с помощью:

     MongoClient.connect(connection_string, { auto_reconnect: true }, function (err, db) {
     //server code/routes in here
     }

Я просматривал https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/connection/server.js но я понимаю, что мое ограниченное понимание того, как пулы соединений управляются в целом, меня обманывает. Я был под впечатлением, что они останутся открытыми на всю жизнь моего сервера. Кто-нибудь может помочь?

изменить: Прочитав комментарии mjhm, я начал более глубоко изучать TCP keep alive. Наткнуться некоторые сайты, которые предполагают, что это может быть делом Azure (и этот вопрос теперь неправильно классифицирован!). По-видимому, балансировщик нагрузки Azure убивает соединения после 1 минуты активности. Я использую веб-сайты Azure, поэтому он может применяться или не применяться, но я думаю, что это понимание достаточно многообещающе, чтобы начать новую линию исследования. Подробнее здесь http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx

1 ответов


From:http://christiankvalheim.com/post/32209721702/tcp-keepalive

TCP keepalive Одна вещь, которая возникает довольно часто как вопрос при использовании узла mongodb.драйвер js-это сокет, который перестает отвечать. Это обычно имеет два источника.

между приложением и экземпляром mongodb есть брандмауэр, и он не соблюдает keepAlive.

тайм-аут сокета должен быть высоким в вашей системе розетка висит и никогда не закрывается. Первая ситуация может быть исправлена путем установки параметров подключения сокета и включения keepAlive и установки значения жесткого тайм-аута в сокете. Это гарантирует, что правильно настроенный брандмауэр будет поддерживать соединение, и если это не так, он будет тайм-аут. Другая вещь для настройки-это ОС tcp_keepalive_time. В основном это высоко для чего-то вроде MongoDB (по умолчанию 2 часа в linux). Установка этого ниже будет правильно тайм-аут мертвых сокетов и пусть водитель поправится.

хорошая ссылка, чтобы узнать больше об этом. http://www.mongodb.org/display/DOCS/Troubleshooting#Troubleshooting-Socketerrorsinshardedclustersandreplicasets