Драйверите на MongoDB предоставят няколко опции за клиентите на Mongo за обработка на различни грешки при изчакване на мрежата, които могат да възникнат по време на употреба. В някои случаи стойностите по подразбиране за тези опции може да не отговарят на вашия случай на употреба, така че е от решаващо значение да разберете различните опции за изчакване MongoClient, за да избегнете непредвидими спирания в потока на приложението си и да подобрите производителността.
Конфигуриране на опции за изчакване за mongo -serviselection, връзка и socketClick To TweetНа абстрактно ниво, всеки път, когато използвате MongoClient за свързване, изпращане или получаване на заявка, той вътрешно използва предварително дефинирани опции за изчакване, за да реши колко дълго приложението ще изчака първоначално установяване на връзка или отговора от сървъра за вашата заявка.
Типичните приложения взаимодействат с различни сървъри на бази данни въз основа на бизнес логиката. Например историята на плащанията ви може да е в един клъстер от база данни, а вашите аналитични записи в друг клъстер. Времето за изчакване по подразбиране може значително да повлияе на поведението на вашето приложение, когато има мрежови грешки. Ако вашият аналитичен сървър не работи, тогава всяка операция ще изчака по подразбиране 30 секунди, преди да се провали (което може или не е това, което искате).
Време изчакване за избор на сървър
Времето за изчакване на избор на сървър е броят милисекунди, които mongo драйверът ще изчака, за да избере сървър за операция, преди да се откаже и да изведе грешка.
Тази опция беше въведена в по-новата версия на следващото поколение драйвери Mongo (версия 3.2.x+ в Java). За всеки тип операция и предпочитание на потребителя, MongoClient избира сървъра, използвайки алгоритъм за избор, за да изпълни операцията.
За операция на запис на самостоятелен сървър има само един наличен сървър, който се избира. В набор от реплики или разчленени клъстери може да има повече от един сървър, който изпълва критериите за предпочитания на потребителя за дадена операция.
Възможните сценарии, при които може да настъпи изчакване за избор на сървър, включват – ако мрежата не работи или неизправност на първичен възел в набор от реплика.
Драйверът на Mongo използва 30 секунди като стойност по подразбиране на времето за изчакване за избор на сървър . В зависимост от случая на използване можем да увеличим или намалим този праг.
Време изчакване на връзката
Времето за изчакване на връзката е броят милисекунди, които драйверът ще изчака, преди да бъде прекъснат нов опит за свързване.
След избор на сървъра, клиентът се опитва да установи връзка със сървъра.
В зависимост от мрежовата инфраструктура и натоварването на сървъра може да се наложи клиентът да изчака установяване на връзка. Възможни сценарии, при които може да се случи изчакване на връзката – сървърът се изключва, проблеми с мрежата, грешен IP/DNS, номер на порт и т.н.
Стойността по подразбиране на изчакване на връзката зависи от версията и езика на драйвера. Най-новите версии на драйвери на Mongo Java и Ruby имат изчакване по подразбиране от 10 секунди за установяване на връзка, докато драйверът на NodeJs няма изчакване.
Ако времето за изчакване е твърде голямо, рискувате да забавите приложението си. Ако времето за изчакване е твърде малко, можете да се откажете твърде бързо. По-добре е да тествате с различни стойности, за да намерите правилното време за изчакване за вашето приложение.
SocketTimeout
Времето за изчакване на сокета е броят милисекунди, които изпращането или получаването на сокет може да отнеме преди изчакването.
След като установи връзка със сървъра, клиентът изпраща заявка до сървъра и получава отговора обратно, като използва вече установена връзка. Вътрешно връзката използва сокет за изпращане на клиентската заявка и получава отговор
Драйверът на Mongo Java и Nodejs имат време за изчакване по подразбиране на сокета от 0s, което означава, че по принцип няма изчакване . Докато Ruby предлага време за изчакване на гнездото 5s. Не искате да поставяте ограничение на това изчакване, тъй като различните операции ще отнемат променливото време за работа.
По-нататъшно проучване
Опциите за изчакване на MongoClient варират в зависимост от различните версии и езици на драйверите на Mongo. Препоръчваме ви да преминете през документацията на класа MongoClient на вашия драйвер, за да разберете вашите опции за изчакване по подразбиране. Предоставихме примерен код по-долу, за да илюстрираме конфигурацията на изчакване в Java и Ruby.
Драйвер на MongoDB Java
List<MongoCredential> creds = new ArrayList<MongoCredential>(); creds.add(MongoCredential.createCredential(username, DBname, password); MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder(); optionsBuilder.connectTimeout(CONNECTION_TIME_OUT_MS); optionsBuilder.socketTimeout(SOCKET_TIME_OUT_MS); optionsBuilder.serverSelectionTimeout(SERVER_SELECTION_TIMEOUT_MS); MongoClientOptions options = optionsBuilder.build(); Mongo m = new MongoClient(new ServerAddress(server , port), creds, options);
Драйвер за MongoDB NodeJs
var uri = ‘mongodb://[username:password@]host[:port1]/[database]’; var options = { server: { socketOptions: { socketTimeoutMS: SOCKET_TIME_OUT_MS, connectTimeoutMS: CONNECTION_TIMEOUT_MS } } }; MongoClient.connect(uri, options, function(err, db) { if(!err) { console.log("We are connected"); } });
Изпуснахме ли нещо? Чувствайте се свободни да ни уведомите в коментарите по-долу. Не забравяйте да се регистрирате за нашия бюлетин, за да сте първите, които получават съвети като тези и още!