sql >> Databáze >  >> NoSQL >> MongoDB

Vysvětlení možností časového limitu klienta MongoDB

Ovladače MongoDB poskytují klientům Mongo několik možností, jak zvládnout různé chyby časového limitu sítě, ke kterým může dojít během používání. V některých případech nemusí výchozí hodnoty těchto možností vyhovovat vašemu případu použití, takže je důležité porozumět různým možnostem časového limitu MongoClient, abyste se vyhnuli nepředvídatelným zasekáváním ve vaší aplikaci a zlepšili výkon.

Konfigurace možností časového limitu pro mongo -serverselection, connection &socketClick To Tweet

Na abstraktní úrovni, kdykoli použijete MongoClient k připojení, odeslání nebo přijetí požadavku, interně použije předdefinované možnosti časového limitu k rozhodnutí, jak dlouho bude aplikace čekat na počáteční navázání připojení nebo odpověď ze serveru na váš požadavek.

Typické aplikace komunikují s různými databázovými servery na základě obchodní logiky. Vaše historie plateb může být například v jednom databázovém clusteru a vaše analytické záznamy v jiném clusteru. Výchozí časové limity mohou výrazně ovlivnit chování vaší aplikace v případě síťových chyb. Pokud je váš analytický server mimo provoz, každá operace počká před selháním výchozích 30 s (což může, ale nemusí být to, co chcete).

Časový limit pro výběr serveru

Časový limit výběru serveru je počet milisekund, po které bude ovladač mongo čekat na výběr serveru pro operaci, než to vzdá a vyvolá chybu.

Tato možnost byla zavedena v novější verzi ovladačů Mongo nové generace (verze 3.2.x+ v Javě). Pro každý typ operace a uživatelské preference MongoClient vybere server pomocí výběrového algoritmu k provedení operace.

Pro operaci zápisu na samostatném serveru je k dispozici pouze jeden server, který je vybrán. V sadě replik nebo ve sdílených clusterech může být více než jeden server, který splňuje kritéria uživatelských preferencí pro operaci.

Mezi možné scénáře, kdy může dojít k vypršení časového limitu výběru serveru, patří – výpadek sítě nebo selhání primárního uzlu v sadě replik.

Ovladač Mongo používá 30s jako výchozí hodnotu časového limitu výběru serveru . V závislosti na případu použití můžeme tento práh zvýšit nebo snížit.

Časový limit připojení

Časový limit připojení je počet milisekund, které bude ovladač čekat, než bude nový pokus o připojení přerušen.

Po výběru serveru se klient pokusí navázat spojení se serverem.

V závislosti na síťové infrastruktuře a zatížení serveru může klient čekat na navázání spojení. Možné scénáře, kdy může dojít k vypršení časového limitu připojení – server se vypne, problémy se sítí, nesprávná IP/DNS, číslo portu atd

Výchozí hodnota časového limitu připojení závisí na verzi a jazyku ovladače. Nejnovější verze ovladačů Mongo Java a Ruby mají výchozí časový limit 10 s pro navázání připojení, zatímco ovladač NodeJs nemá žádný časový limit.

Pokud je časový limit příliš vysoký, riskujete zastavení aplikace. Pokud je časový limit příliš nízký, můžete to vzdát příliš rychle. Je lepší testovat s různými hodnotami, abyste našli správný časový limit pro vaši aplikaci.

SocketTimeout

Časový limit soketu je počet milisekund, které může trvat odeslání nebo příjem na soketu, než vyprší časový limit.

Po navázání spojení se serverem klient odešle požadavek na server a obdrží odpověď zpět pomocí již vytvořeného spojení. Interně připojení používá soket k odeslání požadavku klienta a přijetí odpovědi

Ovladač Mongo Java &Nodejs má výchozí časový limit soketu 0 s, což v podstatě znamená žádný časový limit . Zatímco Ruby nabízí 5s časový limit zásuvky. Tento časový limit nechcete omezovat, protože různé operace zaberou proměnlivou dobu.

Další průzkum

Možnosti časového limitu MongoClient se liší podle různých verzí a jazyků ovladačů Mongo. Doporučujeme vám projít si dokumentaci třídy MongoClient vašeho ovladače, abyste pochopili výchozí možnosti časového limitu. Níže jsme poskytli ukázkový kód pro ilustraci konfigurace časového limitu v Javě a Ruby.

Ovladač 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);

Ovladač 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");
  }
});

Chybělo nám něco? Neváhejte a dejte nám vědět v komentářích níže. Nezapomeňte se přihlásit k odběru našeho newsletteru, abyste byli první, kdo obdrží tipy, jako jsou tyto a další!


  1. MongoDB 'count()' je velmi pomalé. Jak to zdokonalíme/obejdeme?

  2. Seskupit MongoDB podle vnitřních prvků pole

  3. MongoDB $pullAll

  4. Redis - Lua tabulky jako návratové hodnoty - proč to nefunguje