MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Comprensione delle opzioni di timeout del client MongoDB

I driver MongoDB forniscono diverse opzioni per i client Mongo per gestire diversi errori di timeout di rete che possono verificarsi durante l'utilizzo. In alcuni casi, i valori predefiniti per queste opzioni potrebbero non adattarsi al tuo caso d'uso, quindi è fondamentale comprendere le diverse opzioni di timeout di MongoClient per evitare blocchi imprevedibili nel flusso dell'applicazione e migliorare le prestazioni.

Configurazione delle opzioni di timeout per mongo -serverseselection, connection &socketFai clic per twittare

A livello astratto, ogni volta che utilizzi MongoClient per connetterti, inviare o ricevere una richiesta, utilizza internamente opzioni di timeout predefinite per decidere per quanto tempo l'applicazione attenderà una connessione iniziale o la risposta dal server alla tua richiesta.

Le applicazioni tipiche interagiscono con diversi server di database in base alla logica aziendale. Ad esempio, la cronologia dei pagamenti potrebbe trovarsi su un cluster di database e i record di analisi su un altro cluster. I timeout predefiniti possono influenzare in modo significativo il comportamento dell'applicazione in caso di errori di rete. Se il tuo server di analisi è inattivo, ogni operazione attenderà un valore predefinito di 30 secondi prima di fallire (che potrebbe essere o meno quello che desideri).

Timeout selezione server

Il timeout di selezione del server è il numero di millisecondi che il driver mongo attende per selezionare un server per un'operazione prima di rinunciare e generare un errore.

Questa opzione è stata introdotta nella versione più recente dei driver Mongo di nuova generazione (versione 3.2.x+ in Java). Per ogni tipo di operazione e preferenza dell'utente, MongoClient seleziona il server utilizzando un algoritmo di selezione per eseguire l'operazione.

Per un'operazione di scrittura su un server autonomo, è disponibile un solo server che viene selezionato. In un set di repliche o in un cluster partizionato, possono esserci più server che soddisfano i criteri di preferenza dell'utente per un'operazione.

I possibili scenari in cui può verificarsi il timeout della selezione del server includono:se una rete è inattiva o un errore del nodo primario in un set di repliche.

Il driver Mongo utilizza 30 secondi come valore predefinito del timeout di selezione del server . A seconda del caso d'uso, possiamo aumentare o diminuire questa soglia.

Timeout connessione

Timeout connessione è il numero di millisecondi che il driver attende prima che un nuovo tentativo di connessione venga interrotto.

Dopo aver selezionato il server, il client tenta di stabilire una connessione con il server.

A seconda dell'infrastruttura di rete e del carico sul server, il client potrebbe dover attendere l'instaurazione della connessione. Possibili scenari in cui può verificarsi un timeout della connessione:il server viene spento, problemi di rete, IP/DNS errati, numero di porta ecc.

Il valore predefinito di un timeout di connessione dipende dalla versione e dalla lingua del driver. Le ultime versioni dei driver Mongo Java e Ruby hanno un timeout predefinito di 10 secondi per le connessioni mentre il driver NodeJs non ha timeout.

Se il timeout è troppo alto, rischi di bloccare l'applicazione. Se il timeout è troppo basso, puoi arrenderti troppo rapidamente. È meglio testare con valori diversi per trovare il timeout giusto per la tua applicazione.

SocketTimeout

Il timeout del socket è il numero di millisecondi che un invio o una ricezione su un socket può impiegare prima del timeout.

Dopo aver stabilito una connessione con il server, il client invia una richiesta al server e riceve la risposta utilizzando una connessione già stabilita. Internamente, la connessione utilizza un socket per inviare la richiesta del client e riceve la risposta

Mongo Java e Nodejs  Driver hanno un timeout socket predefinito di 0s, il che significa praticamente nessun timeout . Mentre Ruby offre un timeout del socket di 5 secondi. Non vuoi porre un limite a questo timeout poiché diverse operazioni impiegheranno un tempo variabile per funzionare.

Ulteriori esplorazioni

Le opzioni di MongoClient Timeout variano in base alle diverse versioni e lingue dei driver Mongo. Ti invitiamo a consultare la documentazione della classe MongoClient del tuo driver per comprendere le opzioni di timeout predefinite. Abbiamo fornito un codice di esempio di seguito per illustrare la configurazione del timeout in Java e Ruby.

Driver Java MongoDB

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

Driver NodeJs MongoDB

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

Ci siamo persi qualcosa? Sentiti libero di farcelo sapere nei commenti qui sotto. Non dimenticare di iscriverti alla nostra newsletter per essere il primo a ricevere suggerimenti come questi e altro!