Node.js, Mongodb & MongoClient локально - сколько соединений возможно?«Ошибка выключения сокета» - PullRequest
0 голосов
/ 13 мая 2018

Я использую node.js и MongoDB локально. Процессор AMD Ryzen 7 1800 с оперативной памятью 32,0 ГБ. Мое приложение принимает параметры и затем вызывает функции для управления планами питания. Все работает отлично и быстро, пока я не увеличусь.

Используя цикл for для запуска исходной функции при каждой возможной комбинации продуктового магазина, я начинаю получать ошибки, когда открыто около 680 параллельных подключений к MongoDB. Сообщение об ошибке в командной строке: «Ошибка выключения сокета»

Это случается только иногда. Когда я уменьшаю примерно до 520 (уменьшая количество комбинаций продуктового магазина), все работает очень быстро и хорошо (выдает примерно 100 000 рецептов).

Мой вопрос: 1. Почему это происходит? 2. Могу ли я как-то настроить Node.js / MongoClient / MongoDB, чтобы он использовал потенциал моей установки?

Вот пример извлечения кода:

//*File_Recipes* (Here I read out all recipes of one collection)

  //Import of the function that adapts the recipes
  var adapt = require("./File_AdaptIngredientOne")
  //Export of this module, as it will be called with different shop1&shop2- 
  //combos
  module.exports = async function (shop1, shop2) {  
   client.connect(url, function (err, client) {
   if(err) throw err;

   var db = client.db("database");
   var collection = db.collection("Recipes");
   var collection2 = db.collection("adaptedRecipes");

   var cursor = collection.find(query);
   //Now, I call the function adapt() with every found recipe
   //The function adapt needs to read data in MongoDB and insert&update 
   //instances
   cursor.ForEach(
      function(doc) {
          adaptIngredientOne(doc, collection, collection2, shop1, shop2);
          adaptIngredientTwo(doc, collection, collection2, shop1, shop2);
      });
   });
  };

//*File_AdaptIngredientOne* (Here, every ingredient of a recipe will be 
//adapted to a specific shop and then inserted into a collection

  module.exports = async function(doc, collection, collection2, shop1, 
  shop2){
  //Here I find a specific ingredient of a recipe in a specific shop
  var ingredientOne = await collection.findOne({
                         searchTerm: doc.Name + shop1
                         })
  // Now, the amount of this ingredient is updated
  var amount = doc.Amount * ingredientOne.Amount
  // After that, the recipe with an updated ingredient is saved as a new 
  //grocery store specific recipe
  await collection2.insertOne({
   Name: doc.Name,
   Amount: amount,
   ...
   })

//*File_Shops* (Here, the function from *File_Recipes* is called with 
//different grocery store combinations

  var recipes = require("./File_Recipes")
  var grocery_stores = ["Aldi", "Lidl", "Edeka", ....]

  //I now call the recipes function with all grocery store combinations

  for (i=0; i < grocery_stores.length; i++) {
   for(n=i; n < grocery_stores.length; n++) {
    shop1 = grocery_stores[i];
    shop2 = grocery_stores[n];
    recipes(shop1, shop2);
   }
  }
...