• Указать proxy в NodeJs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Для того, чтобы убрать прокси: npm config rm proxy
  • Как работает модуль cluster в nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    При помощи setupMaster следующие вызовы cluster.fork() будут запускать не такие же процессы, а заданный скрипт с заданным окружением и параметрами. По сути одно и то же, только разная запись. А использовать setTimeout там везде не нужно.
  • Можно ли так делать в socket.io node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Кирилл: я согласен, что есть языки и фреймворки в которых глобалы обязательно приведут к запутыванию кода. Кстати, в js изменение базовых прототипов, как string и Date - это тоже своего рода глобалы, т.е. влияет на весь код и проникает своим действием в библиотеки, которые этого вовсе не ожидали. Но в ноде есть замечательный способ управлять глобалами и вообще контекстами - это встроенная библиотека vm: https://nodejs.org/api/vm.html На самом же деле в ноде нет совсем глобального контекста или, точнее, мы никогда не имеем к нему реального доступа. Все файлы, загруженные через require или vm.Sctipt по сути обернуты замыканием, в которое мы можем передать любой контекст, созданный нами специально через vm.createContext или полученный из других частей приложения. И из скрипта он будет виден как глобал и в нем же можно сделать ссылку на самого себя типа context.global = context чтобы было с ним удобно работать. Таким образом части приложения можно экранировать одну от другого так, как мы этого захотим. Я вот почти всегда делаю минимум два слоя в приложении: системный и прикладной. У каждого свой глобал, чтобы приложение могло использовать свой глобальный контекст и делать в нем, например прикладной кеш, необходимый для конкретной задачи предметной области, не универсальный. А системный слой имеет свой кеш, что там сожет быть связано с HTTP или TCP протоколом, например, и так они не конфликтуют. Более того, отдельные эти песочницы (псевдо-глобальные контексты) можно разрушать и создавать заново, их можно даже персистать в базу данных при рестарте возвращая состояние приложения, да что угодно можно делать, очень гибкий инструмент. Рекомендую!
  • Можно ли так делать в socket.io node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Это просто распространенное мнение про анти-паттерн, а вот почему? Какие такие чужие глобалы, если все глобалы в приложении мои? При хорошем планировании глобальной области видимости, это ни чем не плохо. Библиотеки - да, не должны писать в глобал, чтобы между библиотеками не было конфликтов, чтобы одна не затерла код другой. А вот в конкретном приложении глобалы могут упростить многое, чтобы не писать в 100 местах require, можно добавить, например, fs в глобальный хеш api, тужа же добавить os, domain и т.д. Потом обращаться через api.fs.readFile всегда, в приложении. Ни какого риска нет. Кроме того, зависимости это такая вещь, которую логично объявлять в декларативной форме, вот в package.json они о объявлены, потом взяли и при старте все загрузили и все везде доступно.
  • Как синхронизировать количество онлайна?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Sergo Sergo: пример даже могу подогнать https://github.com/tshemsedinov/impress/blob/maste... и https://github.com/tshemsedinov/impress/blob/maste...
    С TCP есть особенности, нужно надстроить пакетный слой, потому, что это потоковый протокол и куски потока могут склеиваться и разделяться как захотят.
  • Можно ли так делать в socket.io node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Кирилл: да, кешируется не exports а module, согласен. Но вот почему плохо глобал? А то, что setInterval и exports и Math и process и еще куча всего видны глобально, это ничего?
  • Можно ли так делать в socket.io node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Кирилл: кешируется не всегда, если модуль ничего не вернул в module.exports, то он не закешируется, а тут человек просто на грани отказа от классического DI. Модуль же может и сам себя пихать в глобальную переменную api.events.connection = function(socket) {...}; И это прекрасно. Но require не во время старта, а на событиях - это ужасно даже для такого эзотерического способа работы с модулями.
  • Веб-сервер на Node.js. Почему дублируется ответ и не отправляются данные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Maloy123: Тогда код в студию, а так сложно сказать, может контент-тайп вредит, для js странный указан, лучше: "application/javascript; charset=UTF-8"
  • Веб-сервер на Node.js. Почему дублируется ответ и не отправляются данные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Maloy123: да я ж говорю, уберите синхронные операции и все будет сразу ок, они блокируют отдачу с сервера, а браузер запрашивает несколько параллельно.
  • Веб-сервер на Node.js. Почему дублируется ответ и не отправляются данные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Посмотрите в промере, там нужно отправить 2Кб паддинг пакет, заголовок "retry", отключить алгоритм нагла через setNoDelay(true), отключить таймаут соединения setTimeout(0).
  • Веб-сервер на Node.js. Почему дублируется ответ и не отправляются данные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Спецификация протокола SSE не выдержана
  • Веб-сервер на Node.js. Почему дублируется ответ и не отправляются данные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    А, это Вы хоитие Server-Sent Events сделать, но протокол SSE же нужно реализовать, почитайте про него, нужно отправлять заголовки, чтобы браузер понимал, что Вы хотите держать соединение открытым, ну и сами события в определенном вормате отправляь нужно, вот пример реализации: https://github.com/tshemsedinov/impress/blob/maste...
  • Как правильно организовать роутинг на node?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Самое приятное в первом примере, что если отдавать объектами, а не отдельными свойствами, вот так, например, '/user': me, то все поля me берутся на момент отдачи, потому, что объект привязывается к пути по ссылке, а не не копируется значение, как в случае, если бы мы написали '/user/name': me.name, в случае с отдельными значениями, нужно оборачивать в функцию типа '/user/name': function() { return me.name; }.

    Если Вы запустите вариант без express и c express и сравните их скорость, то даже на таком маленьком примере будет наблюдать выигрыш в скорости в 2 раза. А чем сложнее будет приложение, тем express все больше и больше залипает по скорости, не говоря уже про память. Учитывая, что express практически ничего полезного не делает, а производительность забирает от 2х до 30х раз, по моим замерам на реальных приложениях, то смысла в нем не вижу.

    Первый промер без параметров, этого мало для полноценного приложения, а вот на базе второго можно даже серьезную систему строить, но масштабирование которой ограничено одним сервером (в режиме cluster), одним портом, одним доменом, одним протоколом, одним приложением. Это подходит для большинства случаев, учитывая, что на одном сервере OVH www.ovh.ie/dedicated_servers/enterprise класса MG-256 его можно масштабировать примерно до 50-200 тыс. запросов в секунду, но это конечно очень зависит от прикладного кода.
  • Синхронный и асинхронный код, почему так называется?

    AJAX это асинхронная операция чтения данных, API XMLHttpRequest асинхронное, результаты приходят в событие.
  • Как вы относитесь к короткоживущим процессам в NodeJS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Сейчас я отказался от использования встроенного IPC (child_process.send) и ZMQ для вызовов между процессами и трансляции событий, перешел на свой RPC на базе TCP, что в 3-5 раз подняло интенсивность обмена между процессами. Но я еще не использую это для ответвления обработки HTTP запросов в стиле воркеров. Пока что по RPC я гоняю синхронизацию структур данных в памяти (некоторые объекты хочется синхронизировать, чтобы все части приложения имели доступ к одинаковому состоянию, можно выбрать, что именно синхронизируется и с какой точностью по времени). Что же касается ответвления обработчиков, я хочу сделать пул процессов, и если процесс получил задание, то другое задание в него не пихать, это именно для того, чтобы в этих воркерах код мог, например, быть синхронным или опасным, чтобы когда он не будет отдавать время в eventloop, то ни кому от этого хуже не будет или если он все похерит и упадет, то ничего не потеряется. Можно держать на готове десятка два таких процессов, и как только они получают задания, то порождать новые, чтобы кол-во готовых не снизилось до нуля. Но нужно и общее кол-во ограничить, чтобы они не наплодились, да еще и по RPC нужно следить, что они живые, т.е. отвечают на heartbeat, например, каждую минуту должны присылать событие, иначе их нужно убивать из мастера.

    Но сейчас у меня еще не так, и как раз приходится в одном процессе иметь параллельно несколько конкурирующих запросов. Более того, эти запросы могут относиться к разным приложениям (разным доменам, вообще к разным проектам и даже заказчикам). Если утечек памяти удается избежать благодаря sandbox`ам, то есть еще исключения, которые ловлю и через domain и через try/catch, а недоловленные и через process.on('uncaughtException', function(err) {...}); В принципе этого хватает, чтобы процессы жили неделями и месяцами железобетонно. Не удается таким образом защититься только от того, что какой-то прикладной код начинает крутить долгую логику, не отдавая управление в eventloop, это действительно подвешивает конкурентные запросы. Какой выход из этого вижу: нужно самому заниматься диспетчеризацией запросов, т.е. отказаться от передачи сокетов из мастера в воркеры через библиотеку cluster и ловить все запросы в главном процессе, а передавать их в дочерние на обработку уже по своему RPC или обернуть IPC. Ну и можно будет добавить таймаут и перепосылать запрос в другой процесс, если за таймаут он не обработан. Так в мастере вообще не будет прикладного кода, только системный, который и проще и лучше отлажен, в общем, не должен падать, а если воркеры падают и виснут, то задача перенаправляется в другой воркер.

    Это существенно снизит производительность, ведь сейчас в мастерах не происходит вообще ни какая обработка HTTP, он просто передает сокеты воркерам, и вся нагрузка распыляется на много ядер. Можно сделать трехслойную систему: мастер->системныеВоркеры->прикладныеВоркеры. Тогда нагрузку по обработке HTTP мы распределим на системные воркеры, которые надежные и не падают, а они уже передают запросы дальше в прикладные воркеры, которые менее надежны.

    Но в общем, все эти танцы меня не радуют, я считаю, что нужно писать код хорошо, без утечек и с хорошей обработкой исключений. Если это не так, то ни что не спасет, нельзя сделать идеальной защиты от дурака. Дурак всегда изобретательнее нас. Вот, к примеру, упал процесс, потому, что в нем обработка запроса пошла "не так", а почему собственно мы должны надеяться, что в другом процессе тот же самый запрос исполнится успешно? Почему вдруг все должно пойти "так как нужно", если предыдущий раз упало, утекло или сломалось? Я думаю, что если уж начались падения, то нужно блокировать запросы определенного типа, которые к ним приводят и звать разработчика, который может их починить. Решать проблему говнокода увеличением мощности серверов это глубоко отвратительная практика.

    Кроме всего, у меня еще все рассчитано на несколько серверов, т.е. на каждом есть свой мастер и воркеры, но один из серверов выделен ведущим. А для распределения нагрузки между серверами в клиентское приложение встроен программный балансировщик, он получает массив IP адресов и выбирает из него рандомно один, с которым работает по API, если что-то не так, то переключается на другой рандомный IP из массива. В конце концов, это интернет, даже сеть не работает с 100% гарантией, так что, наворачивать сложную архитектуру на сервере с несколькими слоями воркеров я не у себя не хочу, лучше клиент будет ждать ответа от сервера и не получив его, перепошлет запрос на другой IP.
  • Как создать приложение на поддоменах meteor?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Только отдельные приложения метеора, совершенно отдельные.
  • Как создать приложение на поддоменах meteor?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Сложно понять, что Вам нужно, расплывчато выражаетесь ) разные остальные - это разные базы со специфическими данными для каждого домена? Можно, ничего не мешает так сделать если писать просто на ноде, без всяких там метеоров, который, скорее всего Вам и не нужен совсем. Про исключение папок из приложения вообще непонятно.
  • Почему не все серверы пишутся на Node js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    js не менее фп, чем haskell, но он мощнее, он мультипарадигменный, хотите пишите в стиле ооп, хотите в фп, хотите прототипное наследование, или классическое процедурное/структурное программирование, можно сделать модель акторов, очень хорошо js подходит для метапрограммирования, а реактивное и событийно-ориентированное вообще как родное на нем. Такой свободы нет ни в одной известной мне инфраструктуре, вот только программировать на js очень сложно, если без специализированных библиотек, на чистом, то это практически низкоуровневый язык программирования (кроме типизации) которая все равно достигается. Вот смотрите: https://blog.indutny.com/c.cpp-in-node