Прекрасная и очень вменяемая статья, спасибо большое.
Внятно, по делу и без приукрас вида «мы тут hello world за 10 минут сделали».
Комментарий: Sync, безусловно жизненно необходим, хотя и уродлив. Лучше, чем без него, но что поделать. Как он, кстати, будет пробрасывать исключения? Файбер или тред клевы именно тем, что в них внятно пробрасываются исключения.
Вопрос: можете ли вы отказаться от nginx в этой ситуации? Я бы ради кометов и вебсокетов не особо волнуясь поставил бы веб-сервер на erlang вместо nginx.
Просто порт 4000 — всё таки штука стремная, отвалится у многих пользователей.
Насколько можно сервер на ноде втыкать вперед?
> Комментарий: Sync, безусловно жизненно необходим, хотя и уродлив.
Нотацию «someObject.someMethod.sync(someObject, arg1, arg2)» необходимо использовать только для вызова сторонних функций, которые не обернуты в ".async()". Свои же функции можно вызывать напрямую: gist.github.com/1159101 (getUserSummary_nodejs_sync.js)
> Как он, кстати, будет пробрасывать исключения?
Так же, как и Fiber — нативно.
> Вопрос: можете ли вы отказаться от nginx в этой ситуации?
Не могу. На нем много другой логики, которую очень не хочется доверять nodejs.
> Я бы ради кометов и вебсокетов не особо волнуясь поставил бы веб-сервер на erlang вместо nginx.
Я вообще скоро комет перепишу на Erlang :)
> Просто порт 4000 — всё таки штука стремная, отвалится у многих пользователей.
Пока не сталкивался, вроде у всех работает. А в чем может быть проблема?
> Насколько можно сервер на ноде втыкать вперед?
Не стоит. Nginx сейчас — как «guard», в котором я всегда уверен, который никогда не отвалится. Тем более, upstream позволяет в случае таймаута перебросить запрос на другой сервер. Он, как бы, сглаживает нестабильность nodejs.
там фишка в том, что сначала идет стандартный HTTP-заголовок Connection:upgrade и все такое, поэтому даже если есть промежуточные проверки, то они проходятся. А дальше уже соединение открыто и обычно ssl внутри не проверяеться. Будет сложно только с сильно умными, которые проверяют траффик и все пакеты, тогда да — не пройдет. Пока с такими не встречались
а у вас нет в планах реализации тэгов в двух языках(оригинальном и русском), а так же утверждение единого варианта некоторых тэгов для того чтобы сообщество не разделялось?
> Насколько node-cluster надёжен?
В плане работы — надежен. Но у него глючный интерфейс cli() start/restart/shutdown. Иногда, при удаленном запуске (через capistrano) не убивает старые процессы, либо вообще ничего не делает. Если зайти на сервер напрямую, то все работает нормально. Все никак не могу с этим разобраться.
У node-cluster нет нативной демонизации, по сему пришлось писать обертку, которая форкает сама себя с setsid=true.
При работае со «stand-alone» (для Cloud процессов, которые не слушают http), пришлось допиливать graceful shutdown/restart.
Еще панисал плагин для node-cluster для слежения за памятью воркеров (если нужно, могу выложить).
> Пользовались ли чем-то другим кроме него (forever)?
Да, forever использую для демонизации Beseda (COMET), поскольку у него всего один процесс.
> Простите, а какая нагрузка на ваш проект в целом? (сколько примерно пользователей, сколько уников в день)
~2к хостов в день
~300-500 человек онлайн
> Тот же вопрос по-другому: нужна ли вся эта чехарда с масштабированием и т.п.
А вы попробуйте без «чехарды» поднять такой проект и держать хотя бы 100 онлайн :)
2000 хостов в день это мало. Справиться один сервер, по крайней мере для обычного сайта.
А как вы считаете количество человек онлайн?
Нашёл тут у вас одну неэффективность — на странице tactoom.com/interest/Tactoom-Feedback при наведении на подпись (Tactoom-Feedback, например) делается POST Ajax запрос для каждой ссылки заново.
Стандартные форумы на стандартных виртуальных хостингах (не впс, а именно хостинг) сто человек онлайн?
Ну-ну.
Не, если там только текст, если нгинкс поднят с proxy_cache/fastcgi_cache, то еще может быть и поверю, но даже если на сервере просто странички с большим количеством графики и комментариев, не удержит хостинг за ~100 рублей 100 человек онлайн, точно говорю.
Ну один выделенный сервер точно удержит 100 человек онлайн и больше. Что вы там делаете с этими людьми онлайн, что требуется такая развесистая архитектура?
Дык то выделенный сервер, в том-то и дело. Даже слабенький сервер при наличии рук, растущих из правильного места, удержит. И более того, может творить те еще чудеса.
А виртуальный хостинг — увы, нет, не удержит.
Я отвечал на коммент, что стандартный форум на стандартном виртуальном хостинге легко удержит нагрузку порядка ~100 человек онлайн.
Я не автор и к разработке tactoom никакого отношения не имею.
А что в tactoom такого сложного делается, не знаю.
Подозреваю, что они постоянно на любое действие пользователя через ajax (а то и через websocket) дергают слой бизнес-логики, а то и базу данных, отсюда и нагрузка такая, более высокая, чем от стандартного plain web 1.0 форума.
Только что глянул: да, там от каждого залогиненного пользователя раз в ~10 секунд отходит ajax-запрос — видимо, используется технология long polling для организации чата.
Ну и практически нет переходов по страничкам, практически все действия осуществляются через ajax — все взаимодействие с людьми, новые посты и т.п.
IP.Board
5-6k хостов, 70-75k хитов в сутки
в пиках около 300-350 человек онлайн (сейчас прямо 200)
nginx на отдачу статики, за ним apache с mod_php5 (практически не тюненый, много лишнего висит)
Что мы неправильно делаем? :)
Хостинг, правда, за 510 рублей и с несколько задранными параметрами (для новых аккаунтов их урезали). Памяти 500 метров — сейчас упираемся в предел и ищем варианты оптимизации.
Дык у вас vps, судя по тому, что вы запросы на бэкенд через nginx проксируете.
Плюс к тому, по стоимости подороже.
Поставьте еще php APC + memcached какой-нибудь, удивительный прирост производительности даже без настройки дает.
Видимо вы фанат nodejs :) 2К хостов в день это как раз на тему преждевременной оптимазации, что говорят зло (многие умные и известные дядьки в их книгах по программированию).
Жду инвайтов на сайт, зарегался не дали мне ничо, элита блин с 2К хостами… :)
У нас один серв на достаточно обычном Core2Duo с четырмя Гб ОЗУ и обычных сказёвых дисках выдерживает при еджениксе-«тупом и медленном пыхе» (самописный движок) сносно держит до 700 активных пользователей и роботов (специально отключали кеш и проверяли). Это социальная сеть с общением, блогами, файлохранилищем и магазином.
Ваше заявление настораживает. Вы проведите нагрузочное тестирование на всякий случай. Может овчинка выделки не стоит в общем процессе.
Выглядит так что было интереснее написать сверхэффективный проект на node.js способный невиданно масштабироваться, до того как понять будет ли это востебованно.
Как я понял ее просто как хотел, а как сделал. И я понял как раз как наоборот, сделано так чтобы можно было легко и масштабировать, когда web/cloud процессы могут работать на любых машинах. Наверника техническая задача решена отлично, хочется пожелаем проекту испытать ту нагрузку, на которую заложена архитектура.
С @visionmedia в плане пуллов действительно всё очень грустно. С другой стороны они в числе тех, кто добился чего-то на Ноде и может немного позволить расслабится. С удовольствием прочитаю вторую часть :)
P.S. А не много ли 300мс в среднем при такой масштабной подготовке?
> кто добился чего-то на Ноде и может немного позволить расслабится
Они гипер-вальяжные.
> P.S. А не много ли 300мс в среднем при такой масштабной подготовке?
Есть минимум, ниже которого отклик не может быть быстрее физически, как не масштабируй. 300ms — это золотая середина. И это не много.
Я работал с MemcacheQ, Amazon SQS, Active MQ… Все они неплохие. Но зачем добавлять еще одну технологию в стэк, если Redis справляется с этой задачей просто идеально?
редис очень-очень быстрый и не только очереди, тогда как все остальное — большое и дает только очереди (при этом с сложным протоколом и большим оверхедом — это я про AMQP)
По умолчанию с реплики вообще читать нельзя. Только если принудительно указать slaveOk=1.
А Mongodelay вообще просто в списке серверов нет (для клиента).
Не имею однозначного ответа на этот вопрос. Исторически так сложилось.
Когда-то были на амазоне, потом оказалось, что Rackspace дешевле и саппорт лучше + OpenStack открытая и знакомая платформа. Сейчас CDN как-то странно лагает, может переберемся обратно на Amazon.
Ощущения от прочтения схожи с ощущениями от экскурсии с рассказом о том, как строили пирамиды. Дикое количество кода, огромное количество проблем… И ещё один G+ в результате.
Ну и от описания просто дико, люто, бешено веет ровно тем же самым снобизмом, которым веет от поста и комментариев автора. В принципе, это можно считать комплиментом — настолько, насколько снобизм можно считать стилем.
Спасибо за статью, с нетерпением буду ждать второй части, очень не хватает таких обзоров реальных рабочих проектов.
Кстати, сходу вопрос, а вот не пожалели что связались с нодой? Стоило ли потраченное время полученной отдачи?
Там выше в комментариях говорили что 300-500 онлайн это мало, но я так понимаю все делалось не для 300-500, а с зазором на рост в десятки и сотни раз. Если все правильно понимаю держать это все будет в разы дольше. Кстати не проводили нагрузочное тестирование, каков потолок при нынешних ресурсах и насколько легко все это будет масштабироваться (горизонтально как я понимаю).
Кстати, а чего связались со статикой на ноде против того же nginx, это хоть как-то оправдано?
> Кстати, сходу вопрос, а вот не пожалели что связались с нодой? Стоило ли потраченное время полученной отдачи?
Не жалею. Но и не скажу, что особо рад.
> Кстати, а чего связались со статикой на ноде против того же nginx, это хоть как-то оправдано?
Статику отдает nginx. На node написаны скрипты, которые ее собирают.
Какая версия Mongoose текла и коматозила? В комментах вы упоминали, что все было написано за 8 месяцев. Вторая версия mongoose была выпущена меньше 2х месяцев назад, вроде переделали ее хорошо. Я сам отказался от первой — она не так сильно тормозила, как была сырая. Если у вас не взлетела вторая, значит, не стоит переходить на нее?
Я сейчас занимаюсь разработкой проекта на ноде + html5. В качестве kvs и связи между серверами разделенной логики redis, в качестве основной БД — mongo и как ORM — mongoose. Было интересно почитать.
Есть и вопрос. Судя по вашим словам mongoose показал себя не с очень хорошей стороны. А вы не пробовали определить какие именно места являются самыми проблемными? Все же не хотелось бы от него отказываться, но сделать реальные замеры производительности сейчас не является возможным.
Я тоже особо не сильно мерял, почему именно он тормозит. Интуитивно — это все их StateMachine.
Созбать объект/провалидировать/сохранить — ок. Но выбрать 100 объектов, каждый из которых содержит вложенные коллекции — лучше делать на mongodb-native.
Добрый день. Прошло 3 года с момента написания этой статьи (вроде как самой свежей Вашей статьи). Статья написана очень подробно и интересно. Но всё-таки прошло некоторое время, достаточно большое для современных технологий. Хотелось бы узнать Вашу точку зрения, насколько такая модель оказалась эффективной? Или Вы что-то более интересное нашли? Было рад услышать от Вас комментарии, а также мысли на тему «плюсы, минусы, подводные камни».
Tactoom.com изнутри — социальная блог-платформа на NodeJS/NoSQL