Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Веб-программирование > JavaScript / HTML

JavaScript / HTML Создание динамической разметки страниц

Ответ
 
Опции темы
Старый 23.05.2014, 09:41   #1
juno24
AnyKey`щик
 
Регистрация: 23.05.2014
Сообщений: 3
Написано одно полезное сообщение
Node.js выкидывает throw при коннекте

Такая проблема с node.js

Задача простая подключиться mongo, сделать insert или update отключиться.
Использую express.

Код взял из примера на gitHUB, нативный драйвер для mongodb.


app.get('/api/cnt/:pid/:blist',function(req,res,next){

MongoClient.connect('mongodb://127.0.0.1:27017/messager', function(err, db) {
 //if(err) throw err;

 var blist = '';
 blist = req.params.blist ;
 bl = blist.split(',');
  
 var collection = db.collection('adv_cnt');
  
 for(i=0;i<bl.length;i++)
 {
  collection.update({pid:req.params.pid,bid:bl[i]},{$inc:{cnt:1}}, {w:1}, function(err, result) {});
 }

})
    res.end("ok");

});
Код вобщем то рабочий.
Но когда решил проверить под нагрузкой , вывалилась ошибка подключния к монго.

Проверял вот таким скриптом, отправляя в цикле запросы curl - ом

#!/usr/bin/perl
use Time::HiRes;
for ($i=1;$i<=1000000;$i++)
{
$cmd="curl \"http://x.x.x.x:3000/api/newbanner/2/\"".$i;
#Time::HiRes::sleep (0.05);
system($cmd);
}
Нод падает между 5000 и 6000 инсертами .

Сделал задержку между запросами 0,05 сек 120 000 записей, полет нормальный.

Но как же заявленная нагрузка в 1 000 000 одновременных подключений?

Есть у кого нибудь мысли ? Хотелось бы на продакшене иметь 100% надежность.

Всем заранее спасибо за ответы !

Последний раз редактировалось moka, 23.05.2014 в 21:19.
(Offline)
 
Ответить с цитированием
Старый 23.05.2014, 11:34   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: Node.js выкидывает throw при коннекте

Зачем делать коннект каждый запрос? создай коннект при старте приложения и используй его.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (23.05.2014)
Старый 23.05.2014, 21:25   #3
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Node.js выкидывает throw при коннекте

Как pax сказал - не пересоздавай соединения при каждом запросе. Это не PHP тебе, тут один поток один контекст - и в этом прелесть: создай одно соединение и используй его.
Mongodb в отличии от mysql имеет хорошую поточность и асинхронность обработки запросов даже при одном соединении, не нужны никакие pool'ы соединений.

Вот мелкий код для переиспользования одного соединения в разных модулях: http://stackoverflow.com/a/17649969/1312722

Да и любопытно, что ты делаешь для нагрузки в 1,000,000 одновременных вставок? Какого рода проект.
При таких нагрузках у тебя будет горизонтально масштабируемая система, а не один нод процесс с коннектом на запрос.

Я на среднем боксе на амазоне выдержал 12,000 одновременных пользователей на сайте, без кеша бд запросов, с 3-7 запросов на каждую загрузку страницы. При этом каждая загрузка страницы также приводит к вставке в бд.
И никаких проблем не испытывал. И столько одновременных пользователей нужно очень постараться набрать.
(Offline)
 
Ответить с цитированием
Старый 25.05.2014, 17:18   #4
juno24
AnyKey`щик
 
Регистрация: 23.05.2014
Сообщений: 3
Написано одно полезное сообщение
Ответ: Node.js выкидывает throw при коннекте

Я тоже подумал про постоянное подключение. Попробую разобраться как это сделать. Отставил скрипт на выходные в таком варианет. В базе уже 2 000 000 записей и нод не падает.
Но все же интересно, где тонкое место в таком варианте. Это глюк драйвера или слабое место монго ?

Переписываю баннерную систему. Решил счетчики завернуть на монго, чтобы научиться с ним работать и протестировать под нагрузкой. Ну а так планы большие.

Спасибо всем огромное !
(Offline)
 
Ответить с цитированием
Старый 25.05.2014, 18:37   #5
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Node.js выкидывает throw при коннекте

Тонкого места тут нету. Технически нету никаких реальных нужд создавать тысячи соединений к монго, следственно и поддерживать их.
Большое число соединений нужно лочить, сортировать и приотеризировать, а это "стоит". Конечно копейки, но когда у тебя тысячи соединений - следственно расход просто глупый.

По своему опыту скажу, что самое главное это понять как работают Compound Index'ы в mongo.

Если у тебя очень простые key<>value данные, и мелкие документы без необходимости сложных запросов, то лучше юзать что-то для этих целей, типа cassandra или couchdb, они лучше подходят для попроще данных, но побольше объёмам.
(Offline)
 
Ответить с цитированием
Старый 26.05.2014, 07:09   #6
juno24
AnyKey`щик
 
Регистрация: 23.05.2014
Сообщений: 3
Написано одно полезное сообщение
Ответ: Node.js выкидывает throw при коннекте

УРА! Настроил постоянное подключение! Запустил тестовый скрипт в 5 потоков . Вставляет примерно 300 записей в секунду и не падает. Вот это мне нравится !

Еще раз Спасибо.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (26.05.2014)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 00:48.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com