Я использую 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);
}
}