web-dev-qa-db-fra.com

erreur de temporisation de la connexion mongodb

J'ai utilisé la base de données mongodb et node.js v12.0.10 pour connecter et mettre à jour la collection mongodb. le code de connexion est le suivant:

 async.parallel({
        RE5: function (cb) {
            MongoClient.connect(config.riskEngineDB, function (err, r5DB) {
                cb(err, r5DB);
            })
        },
        MDB: function (cb) {
            MongoClient.connect(config.monitoringDB, function (err, mDB) {
                cb(err, mDB);
            })
        }
    },
    function (err, DBs) {
        assert.equal(null, err);
        console.log("Connected correctly to Dbs");
        // ..doing updates..

 })

après un certain temps, le script a imprimé l'erreur suivante:

  { [MongoError: connection 39 to 127.0.0.1:27017 timed out]
  name: 'MongoError',
  message: 'connection 39 to 127.0.0.1:27017 timed out' }

Pour votre information, j'ai utilisé différentes options de connexions de mongodb mais cela n'avait aucun sens.

13
Armen Chakhalyan

J'ai eu une expérience similaire, en raison d'une requête qui a pris trop de temps pour répondre

vous avez 2 délais d'expiration configurables dans le pilote de mongo de noeud:

connectTimeoutMS et socketTimeoutMS, tous deux par défaut à 30 secondes ( http://mongodb.github.io/node-mongodb-native/2.2/reference/connecting/connection-settings/ )

si votre requête met plus de 30 secondes à envoyer son premier résultat, elle se terminera par une erreur de connexion dépassée.

si votre requête prend plus de 30 secondes entre deux résultats, elle se terminera probablement avec la fermeture de cette connexion en raison de la réduction du pool.

Vous souhaiterez peut-être augmenter les délais d'expiration ou vous assurer que votre requête est suffisamment rapide (créez un index par exemple). Je conseille d'accélérer la requête, car l'augmentation des délais d'attente peut avoir des inconvénients de performances.

8
Charly Koza

Je voulais fournir cette réponse telle qu'elle est apparue dans une question d'examen mongodb pour l'université mongodb en ligne gratuite. Il est complet et fournit de la documentation.

Je l'ai compris et je vais nettoyer une certaine confusion causée principalement par un manque d'explication dans les leçons. Je ne suis pas critique, mais des explications supplémentaires sont nécessaires pour répondre correctement à cette question.

Tout d'abord, lors de la connexion à mongodb via une application, vous utiliserez un pilote. Ce pilote a des barrières qu'il doit traverser pour faire quoi que ce soit avec le serveur mongodb. Lorsque vous comprendrez ce concept de barriere, vous comprendrez alors cette question.

Chaque connexion qui est finalement établie une liste de choses doit se produire afin de passer à travers les barrières et finalement mener une opération d'écriture ou de lecture.

Visuellement, vous pouvez le voir comme ceci:

Une requête d'E/S se produit ==> || 1ère barrière -> (sélection du serveur err -> --- (serverSelectionTimeoutMS )) ==> | | 2e barrière -> connexion au serveur err -> --- ('connectionTimeoutMS' ) ==> || 3e barrière -> connexion socket err -> --- ('socketTimeoutMS' ) == **** Options d'écriture Obstacles ** ==> || 4ème barrière -> 'écrire la spécification de préoccupation {w: <valeur>, j: <booléen>, wtimeout: <nombre>} ' ==> || 5ème barrière -> une opération d'écriture/lecture réussie

***** Remarque **: n'importe où le long de ce pipeline, une défaillance se produit en fonction de votre logique, une opération d'écriture/lecture réussie peut ne pas se produire.

Nous pouvons considérer les barrières 1 à 3 comme des barrières de connectivité réseau. Si le réseau est en panne ou a des problèmes, ce sont les problèmes que l'on remarquerait à travers les délais d'attente et la gestion des exceptions de ces délais. Ce que l'on doit comprendre, c'est que vous ne pouvez pas effectuer une opération d'écriture avec des problèmes d'écriture si vous ne pouvez pas vous connecter au serveur en premier lieu. La leçon aurait pu illustrer ces points.

Le premier ensemble d'obstacles à une opération d'écriture ou de lecture doit avoir une connexion établie avec le serveur ... Ceci est illustré ci-dessus par les barrières 1 à 3.

Ensuite, après avoir établi une connexion au serveur via un cluster et/ou un jeu de réplicas de clusters, vous pouvez définir des problèmes d'écriture.

Une fois la connexion établie, une écriture peut ne pas se produire pour des raisons autres que la connectivité réseau. Il peut s'agir de collisions de données ou d'une allocation extrême d'écritures en raison de DDOS ou de piratage ou en général pas assez d'espace serveur pour que les données soient écrites sur le serveur. Le fait est que quelque chose d'autre peut provoquer une réaction au problème d'écriture et donc au contrôle via des options pour gérer les erreurs de problème d'écriture.

J'espère que cela aide, car cela m'a fait comprendre la question et la bonne réponse en conséquence. Surtout, nous n'étions pas vraiment concernés, j'espère donc que cela aidera les autres à apprendre et à comprendre cette boucle de rétroaction.

Voici quelques articles que j'ai lus pour m'aider à arriver à cette réponse/conclusion. Si quelqu'un a une amélioration ou une amélioration de mon explication, n'hésitez pas à fournir des commentaires.

https://scalegrid.io/blog/understanding-mongodb-client-timeout-options/

https://scalegrid.io/blog/mongodb-write-concern-3-must-know-caveats/

https://docs.mongodb.com/manual/reference/write-concern/

https://www.mongodb.com/blog/post/server-selection-next-generation-mongodb-drivers

2