Представлен (https://nodejs.org/en/blog/release/v6.0.0/) релиз Node.js 6.0.0, платформы для выполнения высокопроизводительных сетевых приложений на языке JavaScript. В октябре ветка Node.js 6.x получит статус стабильного выпуска с длительным сроком поддержки (LTS), обновления для которого будут выпускаться в течение 30 месяцев. LTS-ветки предлагаются для сложных промышленных внедрений, крупных предприятий и тех, для кого стабильность имеет первоочередное значение. Поддержка прошлой ветки Node.js 5.x будет осуществляться ещё два месяца, LTS-ветка 4.x будет поддерживаться ещё год.
Из новшеств Node.js 6.0 отмечаются значительные оптимизации производительности, например, загрузка модулей ускорена почти в 4 раза. Добавлены новые конструкторы (https://github.com/nodejs/node/pull/4682) для API Buffer (Buffer.from(), Buffer.alloc() и Buffer.allocUnsafe()). В API File System представлены более эффективные реализации вызовов fs.realpath() и fs.realpathSync(). Расширены средства обработки ошибок. Движок V8 обновлён до версии 5.0, в которой обеспечена поддержка 93% возможностей JavaScript, определённым в спецификации ECMAScript 6 (https://www.opennet.me/opennews/art.shtml?num=42450).URL: https://nodejs.org/en/blog/release/v6.0.0/
Новость: http://www.opennet.me/opennews/art.shtml?num=44337
как запустить несколько воркеров на Nodejs спрятав их за nginx?
как вообще работают с NodeJS, запускают несколько инстансов?
Кластеры херачат, но обычно нет надобности.
> как запустить несколько воркеров на Nodejs спрятав их за nginx?
> как вообще работают с NodeJS, запускают несколько инстансов?читай за микросервисы, контейнеры и программные стеки основанные на этом. Там целая занятная отрасль хипстопрограммирования.
Можно кластерами, можно нафоркать мастер процесс.
Для начала надо спросить себя: "а нужно ли это делать?". Все-таки нода это не пых, 10k для нее не проблема, так что не стоит переносить на нее старые практики.
Когда хайлод проще разделить на кластеры - у фронта свой, у api второй, у фоновых задач (планировщик к примеру) - третий и т.д.
> Все-таки нода это не пых, 10k для нее не проблемаЭто вы в учебнике вычитали или данные для hello world?
Ясно, что хелловорлд, да только пых у меня 16К-20K тянет при таком раскладе(если тестить с ab). Ноду не тестил, да и вообще, что толку от хелловорлд-то?
Кому нужен Highload на PHP, выбирают решения от 1C-Bitrix .
Анальный зонд от русских эффективных менеджеров?
Да, на ноде такое пилить и пилить.
Так тонко, что аж толсто ^_^
Кому нужен highload вообще не выбирают PHP.
16К-20K в минуту? Вполне может быть, но речь то шла про количество одновременных соединений. Кстати ab для тестирования подобных нагрузок не годится, он на это не рассчитан и создать ее не сможет.
На собственном опыте скажу что да, иногда надо. Например у меня на проекте нагрузки около 50к запросов в секунду в среднем, при этом надо еще всякую логику считать и базу ходить. Нода то выдерживает но ядра процессора имеют предел на количество операций, так что когда ядро занято на 100% быстрее работать на нем уже не получится, поэтому логично кластеризоваться по количеству ядер (например на процессоре с 8 ядрами можно сделать 8 процессов)
для этого нодэжснутые придумали себе костыльhttps://nodejs.org/api/cluster.html
>> для этого нодэжснутые придумали себе костыльШкольник-иксперд в ветке! Всем преклонить колено!
Я использую pm2 — очень хорошая штука. Даже переписывать ничего не надо — pm2 сам как-то делает так, чтобы несколько инстансов могли использовать один и тот же порт. Ведёт логи, автоматически перезапускает инстанс, если он сдох или съел N МБ оперативки.1) pm2 ecosystem создаст ecosystem.json
2) затем подправить под себя ecosystem.json (см. http://pm2.keymetrics.io/docs/usage/application-declaration/ )
3) pm2 start ecosystem.json запустит приложение.
4) Теперь каждый раз, когда демон pm2 стартует, это приложение будет запускаться.
Я тоже им пользуюсь в некоторых случаях (кстати разделение портов работает за счет того, что он стандартным нодовским модулем cluster процессы запускает), но при высоких нагрузках в десятки тысяч запросов в секунду иногда случалось так что падал основной процесс pm2 со всеми дочерними, приходилось еще поверх него супервизор лепить, так что иногда имеет смысл настроить кластеризацию самому, особенно когда нужно очень гибкое управление каждым отдельным процессом
> платформы для выполнения высокопроизводительных сетевых приложений на языке JavaScriptРебят, я правильно понимаю, что в мире дотнета роль ноды должен выполнять кестрел?
На винфак.
Как-то тостили мы наш back-end на Java для проверки хайлода по запесям в Hadoop. Взяли значит Node.js v5, форкнули на 4 ядра и начали слать POST запросы, avg ~ 136 000 в минуту выходило :)
Это около 2к в секунду, что то маловато, нода вполне по 10к на ядро может, хотя от внутренней логики зависит
Глядя на комменты вспомнил древний анекдот:
Подходит сын к папе и спрашивает:
-Папа, а что такое многозадачность?
-Погоди, сынок, вот оформатирую дискетку и расскажу.Всё-таки при всех этих паттернах проектирования, доктринах, и прочих наворотах для удобства, я лично предпочитаю си, и правила реализации, с префиксами в функциях и с разделением по файлам различных методов.
клоун: Уверен, что это лучший вариант?Посмотрим на ЯП абстрактно.
Есть переменные.
Есть структуры. Структуры могут иметь методы, позволяющие обращаться к переменным этой структуры.
struct test_s
{
int x;void set(int y) {x=y;}
}test_s s;
s.set(10);Можно создать структуру вообще без переменных (это называют namespace).
struct test_s
{
void print() {...};
}test_s::print();
В некоторых модулях (частях модуля; помним про область видимости), где часто используются функции можно написать "use test_s" и дальше обращаться к её функциям без указания имени структуры.
Добавим права доступа к структуре, причём как на переменные, так и на функции: public можно использовать из вне, protected только из методов самой структуры. Добавим наследование структур (классов) и третий тип доступа - private - то, что не должно наследоваться. Разрешим возможность вызова всех отнаследованных функций, т.е. если s1 порождает s2, а s2 порождает s3, то можно вызвать любую из функций: s1::func(), s2::func(), s3::func(), this::func(), parent::func().
Интересно, что при таком подходе стирается разница между функциональным и объектным программированием, теперь это лишь наше желание засовывать функцию внутрь структуры или нет.
ЯП позволяют такое? Хрен. struct, class, namespace, static - хотя всё это одно и то же. Или идея, что "всё есть класс", когда даже void main() пихают в класс - зачем?
А ЯП позволяют хранить идентификатор класса вместе с классом? Т.е. у меня L1, хранящий ссылки на родительский класс (геометрическая фигура), значениями которого являются наследники (круг, квадрат, треугольник). Я хочу рисовать их
while(ptr)
{
ptr->print();
ptr = ptr->next;
}Проблема в том, что в большинстве ЯП будет вызвана функция print() родительского класса (фигура), а не наследника. И вместо print() придётся городить switch(), знающий про всех наследников и выбирающий нужного (== приводящий типы). Вот делать мне, программисту, больше нечего: добавил здесь, подправил там, не забыл дописать здесь - где удобство от использования ООП. Где?
---
В С/С++ принято разделять файлы заголовков (h) и реализации (c, cpp). Зачем? Чтобы исправлять не в одном месте, а в двух? Какой смысл в правиле, что объявление должно идти до использования: компилятор не может второй проход сделать и нагружает этой работой человека? Не иначе.
---
Я "свой" ЯП так и не нашёл. То одно не так, то в другом косяк. Везде ты не программируешь сущности, а занимаешься мелочёвкой, заботясь и помня тысячи мелочей + особенности их реализации в конкретном ЯП.
>Я "свой" ЯП так и не нашёл. То одно не так, то в другом косяк.Методичку-то осиль до конца, дурачок, там написано, что твой язык - C#.
P.S. безграмотный пост безграмотен.
> В С/С++ принято разделять файлы заголовков (h) и реализации (c, cpp). Зачем?
> Чтобы исправлять не в одном месте, а в двух? Какой смысл
> в правиле, что объявление должно идти до использования: компилятор не может
> второй проход сделать и нагружает этой работой человека? Не иначе.Для того, для чего и в джаве выделяют интерфейсы и классы их реализующие. Абстрагирование интерфейса от реализации упрощает реализацию сложных систем.
В итоге, и в джаве, и в сях получается по два файла на класс/модуль.
клоун: Так пишут в книжках, не объясняя за счёт чего достигается упрощение и чем повторение одного и того же дважды проще, чем написание этого один раз.Открою секрет: хидер элементарно генерится из реализации. Разделяя на два файла ты не абстрагированием занимаешься, а фигнёй страдаешь, набирая код дважды и следя чтобы он в обоих файлах был идентичным.
Не всё, что является привычным, является нужным и полезным.
> клоун: Так пишут в книжках, не объясняя за счёт чего достигается упрощение
> и чем повторение одного и того же дважды проще, чем написание
> этого один раз.
> Открою секрет: хидер элементарно генерится из реализации. Разделяя на два файла ты
> не абстрагированием занимаешься, а фигнёй страдаешь, набирая код дважды и следя
> чтобы он в обоих файлах был идентичным.Упрощение достигается а счет абстрагирования (уменьшения количества информации, с которой приходится работать программисту).
В реализации гораздо больше информации, чем в интерфейсе.С++, кстати, провоцирует добавить в объявление класса private секцию с информацией о реализации, в отличие от С, где внутренние static-функции не добавляются в интерфейсный хедер.
Тоже в джаве.
А ведь для того, чтобы работать с классом не нужно видеть его реализацию.
Это, конечно, решается с помощью интерфейсов, но городить на каждый класс по интерфейсу...
Поэтому авто-генерится документация по джава-классам, читай авто-хедер такой.Что удобнее - работать с вручную отредактированной документацией (C-хедером), к тому же проверяемой компилятором, или с авто-генерённой документацией - это ещё вопрос.
клоун: А отсутствие в сях нормальной реализации include once вынуждает заниматься ещё одной фигнёй:#pragma once
#ifndef FILENAME
#define FILENAME........
#endif
Тоже будешь обосновывать его необходимость, рассказывая сказки про великую мощь сишного препроцессора?
То, что ты вынужден набирать руками в каждом файле один и тот же код говорит о том, что ЯП в этой части не доработан и не продуман.
>[оверквотинг удален]
> #pragma once
> #ifndef FILENAME
> #define FILENAME
> ........
> #endif
> Тоже будешь обосновывать его необходимость, рассказывая сказки про великую мощь сишного
> препроцессора?
> То, что ты вынужден набирать руками в каждом файле один и тот
> же код говорит о том, что ЯП в этой части не
> доработан и не продуман.То, что ЯП позволяет реализоввывать на нём сложные системы, говорит от том, что ЯП продуман для реализации таких систем.
#pragma once - не нужно
#ifndef FILENAME - не напрягает.У каждого языка свои заморочки - в джаве, например, имя файла почему-то должно соответствовать имени класса.
клоун: Мда...Два подключения подряд - и ты получишь гарантированную ошибку.
#include "file.h"
#include "file.h"Если бы include работал как include once, ошибки бы не возникло.
Обратное не верно: нет ни одной ситуации, когда требуется несколько раз инклюдить один и тот же файл.
Получается, что ЯП создан так, чтобы провоцировать ошибки.
И ты считаешь, что это нормально. Мда... Я даже не хочу смотреть на остальной твой код. Я заранее знаю: таких "особенностей" в нём будет много, потому что ты привык так мыслить и не понимаешь ошибочности собственного мнения.
Товарищ, вы лучше бросайте программирование, не ваше это, хотя для вас как раз JavaScript и создан.В си нужно понимать, что делаешь и когда ты поймёшь этот язык, тогда и сможешь себя назвать программистом.
Разделение на h и c? В чем проблема? Какой ещё дубляж?
Благодаря этому разделению ты можешь сделать идеальный black box, описывая в h лишь название функции которые можно вызывать, скрывая всю реализацию.
Я лично терпеть не могу языки программирования где все смешанно в одном файле. Это полный п***** разбираться в этой куче.
клоун: с возрастом, наверное, приходит... Лет через 20 поймёшь. Или когда выучишь штук 30 ЯП разных типов, каждый из которых будешь использовать по работе - тогда придёт понимание что в одном ЯП есть, а чего в другом нет. А когда ты знаешь 1 (прописью: один) ЯП, который тебе 3 года вдалбывали на лекциях и лабораторных, да, такое тяжело потом выходит.
>Обратное не верно: нет ни одной ситуации, когда требуется несколько раз инклюдить один и тот же файл.Давай ты не будешь делать такие категоричные заявления, а пойдешь изучать пхп? Зачем тебе няшная сишечка?
Инклюдом одного файла в ней делается кодогенерация макросами
https://habrahabr.ru/post/154811/
Ты путаешь С и С++, функциональное и процедурное программирование. Не разобрался в наследовании и полиморфизме. Рассуждаешь то о конкретном ЯП, то о ЯП вообще, при этом не имея понятия о катастрофических различиях в реализации ООП парадигмы в них. При таком ниасиляторстве не удивительно , что ты не нашел "свой" ЯП.
Респект ребятам! Хорошую вещь пилят...
а мы тут потихоньку на ней свою пилим..
:)П.С. лицензии блюдем.. ибо свято!