#javascript #node.js #mongodb #mongodb-replica-set
#javascript #node.js #mongodb #mongodb-набор реплик
Вопрос:
Я хочу подключиться к набору реплик MongoDB (только один экземпляр для работы с потоками изменений), имея возможность получать уведомления о потере / повторном подключении соединения. Я следовал тому, что описано здесь:
const { MongoClient } = require("mongodb");
// Replace the following with your MongoDB deployment's connection
// string.
const uri =
"mongodb srv://<clusterUrl>/?replicaSet=rsamp;writeConcern=majority";
const client = new MongoClient(uri);
// Replace <event name> with the name of the event you are subscribing to.
const eventName = "<event name>";
client.on(eventName, event => {
console.log(`received ${eventName}: ${JSON.stringify(event, null, 2)}`);
});
async function run() {
try {
await client.connect();
// Establish and verify connection
await client.db("admin").command({ ping: 1 });
console.log("Connected successfully");
} finally {
// Ensures that the client will close when you finish/error
await client.close();
}
}
run().catch(console.dir);
Я попытался подписаться на события:
serverOpening
и работает нормальноserverClosed
и я не могу понять, почему, но это не работает!!!
Нет события «переподключения», какое-либо решение?
Ответ №1:
Вы смешиваете подключения для мониторинга и подключения к приложениям. К сожалению, документация, на которую вы ссылались, не говорит об этом и не документирует события CMAP, поэтому путаница понятна. Более подробное объяснение событий, которые публикуют драйверы (включая драйвер узла), см. в документации по драйверам Ruby.
Соединения мониторинга устанавливаются драйвером, чтобы выяснить, какие серверы существуют в развертывании, с которым ему было поручено работать. Для каждого известного сервера устанавливается одно (или два, в зависимости от версии драйвера и сервера) такое соединение. Вы не контролируете, когда устанавливаются эти соединения. Эти соединения НЕ используются для инициируемых вами операций (вставки / поиска и т. Д.). Они используются только драйвером внутри.
События, опубликованные для мониторинга подключений, — это открытие сервера, закрытие сервера, сердцебиение сервера — те, которые перечислены здесь . Вы получите эти события при создании экземпляра клиента (при условии, что клиент соответствует спецификациям, которого нет в конфигурации узла по умолчанию, поскольку вы его используете) без каких-либо операций, таких как создание потока изменений.
Подключения приложений устанавливаются драйвером для выполнения таких операций приложения, как поиск и вставка. Один из них будет необходим для вашего потока изменений. События, относящиеся к этим подключениям, являются событиями CMAP и начинаются с «Connection» или «Pool», например, connectionCreated. Эти соединения не устанавливаются до тех пор, пока вы не выполните операцию, если только минимальный размер пула на клиенте не установлен на значение, большее нуля.
Если вы хотите «отслеживать соединения», вы можете подписаться на любую категорию событий или на обе.
С учетом сказанного, оба типа соединений управляются внутренне драйвером. Вы не имеете права голоса при их создании или уничтожении (кроме установки минимального размера пула и времени простоя). Итак, если ваша цель — иметь работающий, непрерывно работающий, возобновляющийся поток изменений, вам это не нужно, и вместо этого вы должны использовать правильные шаблоны потребления потока изменений, подобные описанному здесь в синтаксисе Ruby, хотя все драйверы, совместимые со спецификациями, должны предоставлять эквивалентный интерфейс.
Наконец, ни в одной спецификации драйвера не определено событие «переподключения». Если у вас есть вопрос конкретно об этом событии, вам следует обратиться к документации драйвера, где оно описано, и внимательно прочитать эту документацию, чтобы выяснить реализованное поведение.