MongoDB-drivrutiner tillhandahåller flera alternativ för Mongo-klienter för att hantera olika nätverksfel som kan uppstå under användning. I vissa fall kanske standardvärdena för dessa alternativ inte passar ditt användningsfall, så det är viktigt att förstå de olika MongoClient timeout-alternativen för att undvika oförutsägbara stopp i ditt applikationsflöde och förbättra prestandan.
Konfigurera timeout-alternativ för mongo -serverval, anslutning och socketClick To TweetPå en abstrakt nivå, när du använder MongoClient för att ansluta, skicka eller ta emot en förfrågan, använder den internt fördefinierade timeout-alternativ för att bestämma hur länge applikationen ska vänta på att en första anslutning upprättas eller svaret från servern på din förfrågan.
Typiska applikationer interagerar med olika databasservrar baserat på affärslogiken. Till exempel kan din betalningshistorik finnas på ett databaskluster och dina analysposter på ett annat kluster. Standardtidsgränserna kan avsevärt påverka ditt programs beteende när det finns nätverksfel. Om din analysserver är nere kommer varje operation att vänta på en standard på 30s innan den misslyckas (vilket kanske är vad du vill ha eller inte).
Timeout för val av server
Timeout för val av server är antalet millisekunder som mongo-föraren väntar med att välja en server för en operation innan han ger upp och ger upp ett fel.
Det här alternativet introducerades i den nyare versionen av nästa generations Mongo-drivrutiner (version 3.2.x+ i Java). För varje typ av operation och användarpreferens väljer MongoClient servern med hjälp av en urvalsalgoritm för att utföra operationen.
För en skrivoperation på en fristående server finns det bara en tillgänglig server som väljs. I en replikuppsättning eller fragmenterade kluster kan det finnas mer än en server som uppfyller användarpreferenskriterierna för en operation.
Möjliga scenarier där servervalstimeout kan inträffa inkluderar – om ett nätverk är nere eller ett primärt nodfel i en replikuppsättning.
Mongo-drivrutinen använder 30s som standardvärde för timeout för serverval . Beroende på användningsfallet kan vi öka eller minska denna tröskel.
Timeout för anslutning
Timeout för anslutning är antalet millisekunder som föraren väntar innan ett nytt anslutningsförsök avbryts.
Efter val av server försöker klienten upprätta en anslutning till servern.
Beroende på nätverksinfrastruktur och belastning på servern kan klienten behöva vänta på att en anslutning upprättas. Möjliga scenarier där anslutningstimeout kan inträffa – servern stängs av, nätverksproblem, fel IP/DNS, portnummer etc.
Standardvärdet för en anslutningstidsgräns beror på drivrutinens version och språk. Mongo Java &Ruby senaste drivrutinsversioner har en 10s standard timeout för anslutningsetableringar medan NodeJs drivrutin inte har någon timeout.
Om timeouten är för hög riskerar du att stoppa din ansökan. Om timeouten är för låg kan du ge upp för snabbt. Det är bättre att testa med olika värden för att hitta rätt timeout för din applikation.
SocketTimeout
Socket timeout är antalet millisekunder en sändning eller mottagning på en socket kan ta innan timeout.
Efter att ha upprättat en anslutning till servern skickar klienten en begäran till servern och får tillbaka svaret med en redan etablerad anslutning. Internt använder anslutningen en socket för att skicka klientförfrågan och tar emot svaret
Mongo Java &Nodejs Driver har en standard socket timeout på 0s vilket betyder i princip ingen timeout . Medan Ruby erbjuder en 5s socket timeout. Du vill inte sätta en gräns för denna timeout eftersom olika operationer tar den varierande tiden att fungera.
Ytterligare utforskning
Alternativen för MongoClient Timeout varierar på de olika versionerna och språken av Mongo-drivrutiner. Vi uppmuntrar dig att gå igenom dokumentationen för MongoClient-klassen för din förare för att förstå dina standardalternativ för timeout. Vi har tillhandahållit lite exempelkod nedan för att illustrera timeout-konfigurationen i Java och Ruby.
MongoDB Java-drivrutin
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-drivrutin
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"); } });
Har vi missat något? Låt oss gärna veta i kommentarerna nedan. Glöm inte att registrera dig för vårt nyhetsbrev för att vara den första som får tips som dessa och mer!