• Как правильно масштабировать nodejs-приложение с помощью cluster?

    @xfg
    Получается нужно каждый воркер стартовать на своем порту? Или нет? Если да, то как это сделать?

    Да. Но для начала давайте вы перестанете использовать системные порты из диапазона 0-1023 и будете брать порты 1024+
    Официальная документация советует это делать так
    If you want to listen on a unique port, generate a port number based on the cluster worker ID.


    Если всё правильно настроено, ваш браузер должен коннектиться на адрес ws://test.domain.local:3333
  • Как правильно масштабировать nodejs-приложение с помощью cluster?

    @xfg
    Alexander K.: ну у вас несколько вариантов или попробовать все найденные решения или залезть в код socket.io и самому разобраться как там всё работает и почему возникает эта ошибка, затем придумать решение и поделиться с сообществом или просто сменить socket.io на что-то другое. Но вы еще так и не попробовали решение, которое предложил nkzawa.
  • Как правильно масштабировать nodejs-приложение с помощью cluster?

    @xfg
    Alexander K.: я это всё не использовал. У меня работало в кластере без всяких ошибок, но это было очень давно и с тех пор авторы уже наверное релизнули кучу новых версий. Помню только, что приложение висело за nginx вот как в этой статье socket.io/docs/using-multiple-nodes/#nginx-configu... попробуйте может быть действительно товарищ nkzawa прав, но что-то я сомневаюсь, что в этом проблема.

    А в статье описывается решение для версии 1.1, сейчас у них на гитхабе уже ветка 1.4, вполне могли где-то поломать обратную совместимость. Если решение из статьи не работает, то для чистоты эксперимента нужно ставить туже версию, под которую статья написана :)
  • Как правильно масштабировать nodejs-приложение с помощью cluster?

    @xfg
    Alexander K.: хотя по прочитаному с предоставленой nkzawa ссылке я чувствую, что он не прав и это нужно только если сайт юзает long-polling для старых браузеров, которые не поддерживают вебсокеты.

    Но тоже вполне могу ошибаться. Вобщем наверное вам придется немного погуглить :)
  • Как правильно масштабировать nodejs-приложение с помощью cluster?

    @xfg
    Alexander K.: еще здесь https://github.com/socketio/socket.io/issues/2045 говорят, что вроде как если сервер юзает множественные процессы, то нужно делать липкие сессии. Но а вообще гугл поможет. Я не могу точно сказать в чем причина, потому что использовал socket.io очень давно, затем откатился на более низкоуровневую библиотеку ws и никогда больше не использовал socket.io.
  • Как правильно масштабировать nodejs-приложение с помощью cluster?

    @xfg
    Alexander K.: Да, удаляйте сразу. Смысл придумывать какие-то таймеры и лишнюю логику, если при обновлении происходит дисконнект с сервером.
    Ну и отказаться от уведомления пользователей о том что какой-то юзер зашел на сайт

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

    @xfg
    Такого не произойдет, так как для пользователя лишь одна запись в БД, следовательно и токен один

    Сделайте связь один ко многим. Таблица токенов с полями user_id | token_id | created_at
  • Как правильно масштабировать nodejs-приложение с помощью cluster?

    @xfg
    Alexander K.: По дефолту node cluster использует round-robin. Если грубо, это означает, что соединения раскидываются по кругу (1, 2, 3 ... 8, 1, 2, 3 и т.д.).

    Я не вижу смысла, зачем восстанавливать соединение на том же процессе? Что будете делать если воркер (процесс) неожиданно умрет, куда будете восстанавливать? Суть как раз в том, чтобы ваш мастер автоматически порождал новые воркеры взамен умерших, тем самым поддерживая общую работоспособность приложения, а воркеры у вас будут умирать от всяких непойманых исключений, если вы конечно не из этого числа "мне не нужны юнит-тесты, я настолько крутой, что всегда пишу код без ошибок".
  • Как правильно запустить nodejs-приложение в кластере на мультипроцессорной машине?

    @xfg
    Речь о вебсокетах socket.io/sock.js/ws ? Несколько серверов не может подняться, поскольку порт один и node.js cluster делит этот порт между дочерними процессами.

    Для express к сожалению не могу показать, так как ничего толкового не гуглится. А просто примеры есть в документации к kue, вполне понятные.

    Kue и масштабирование не связаны напрямую между собой. Kue поможет вам автоматически делегировать задачу конкретному процессу (связанные с вашими крон джобами например).

    О масштабировании я написал потому что, в серьезных проектах об этом часто задумываются и многие используют для решения этой задачи redis и имел ввиду, что если вдруг это ваш случай и вы тоже уже используете redis для каких-то задач, то возможно разумнее было бы в качестве сервера очередей выбрать kue, так как он работает поверх redis, чем тащить в проект еще одну зависимость вроде rabbitmq или еще какого-нибудь другого сервера очередей. Только и всего.

    Но если вам все таки интересен принцип масштабирования, то один из вариантов можно подсмотреть в socket.io-redis. Все процессы подписываются на один redis канал и получают из него сообщения. Приложение публикует события в этот redis канал. Только и всего. Это нужно для того чтобы можно было отправить событие пользователям которые подключены к разным процессам/серверам.
  • Как разделять логику приложения?

    @xfg
    Не отвалится. Бизнес-логика приложения должна где-то жить. Вместо модели толстый сервер - тонкий клиент, получится модель тонкий сервер - толстый клиент.
  • Как разделять логику приложения?

    @xfg
    Варианты есть всегда, но веб движется в сторону разделения. Одним сервером можно кормить web/android/ios клиенты. Но к сожалению ajax сайты на текущий момент умеет индексировать только google, остальным нужны костыли. Хотя технологии уже более 10 лет.
  • Как использовать *одно* соединение WebSocket на все вкладки?

    @xfg
    pqgg7nwkd4: Да. Какой смысл при асинхронности иметь несколько потоков? Да даже если бы было несколько потоков, вы могли бы сделать простейший мьютекс на основе local storage.

    Если у вас асинхронное подключение, то нужно сделать такой мьютекс, иначе с клиента может успевать уйти несколько запросов на подключение. Если подключение синхронное (блокирует поток), то никаких мьютексов не нужно.

    Но вы же в курсе, что пользователь может открыть консоль браузера и вручную открыть столько соединений, сколько захочет (даже внутри одной вкладки), если этого не запрещает сервер?
  • Как использовать *одно* соединение WebSocket на все вкладки?

    @xfg
    Вячеслав Юрьевич: Javascript в браузере работает в один поток, если поток заблокировать в одной вкладке то выполнение всех остальных подвиснет. Попробуйте, откройте две вкладки и в одной из напишите
    while(true) console.log('do work');
    В другой напишите любой javascript код и обратите внимание, что он не будет выполняться. Никакого состояния гонки быть не может. Поток один.
  • Как работают языки программирования?

    @xfg
    А вот прям "из коробки" пхп работает и "умирает".

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

    Но пхп как демон - это ведь не совсем тривиальная задача без сторонних пакетов.

    <?php
    //daemon.php
    $userCounter = 0;
    while(true) {
    echo "Hey! I can increment user counter. It's cool right? userCounter: " . $userCounter++;
    sleep(1);
    }

    $ php /path/to/daemon.php

    Похожие Hello world примеры на других языках
    Python stackoverflow.com/a/9047339/2868530
    Ruby stackoverflow.com/a/3688586/2868530

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

    Некорректно сравнивать php и node.js. PHP - язык, Node.js - платформа. В PHP (равно как и в python/ruby/perl и т.д.) нужно самому сделать этот бесконечный цикл. В Node.js этот цикл реализован в виде event loop. Какой-нибудь express, внутри себя работает с http модулем, который в свою очередь работает поверх event loop. Складывается впечатление, что в node.js всё работает как демон из коробки. Это не так:
    //test.js
    console.log('I print this text and die.');

    $ node /path/to/test.js

    Такая программа напечатает текст на экран и умрет. Единственное, это то, что в node.js встроили реализацию event loop и написали модули, работающие поверх него, поэтому используя эти модули программа сразу работает как демон без всяких циклов. Но где-то там в исходниках node.js можно найти, что всё в итоге упирается в обычный бесконечный цикл. Вот и всё.
  • Как правильно сделать сессии и авторизацию на PHP?

    @xfg
    Александр Казакевич: вам о полиморфизме говорят. Классу сессий не стоит знать, где в действительности будут храниться сессии. Для этого нужно описать интерфейс хранения сессии. Класс хранения (драйвер) должен реализовывать этот интерфейс. В конструкторе класса сессий принимаем параметр типизированный нашим интерфейсом.

    Итого получается, что вы не зависите от хранилища. Можете передать в конструктор класса сессий любой драйвер, который реализует интерфейс и всё будет работать, без изменения кода.

    Теперь о плюсах. Сессии в php хранятся в файлах. Это означает, что когда вы поставите лоад балансер и позади него 2+ бекенд сервера, у вас запросы от клиента начнут приходить то на один сервер, то на другой. Пользователь будет от запроса к запросу, то залогинен, то разлогинен. Конечно есть решения, липкие сессии, php вроде настраивается на хранение в redis. Но самое лучшее решение, это абстрагироваться от механизма хранения сессий в классе сессий и предложить несколько вариантов различного хранения и пользователь уже сам через конфиг сможет в нужный момент времени поменять механизм хранения с одного на другой и даже написать свой, если стандартные не устроят.

    Но новичку это будет сложно понять. Сначала нужно, какую-нибудь простую книгу по паттернам прочитать, где расскажут, что такое композиция, зачем нужна и чем она лучше наследования.

    Вообще PHP как первый язык, не очень хорошо, дает много свободы и поэтому на нем так много раздолбайского кода. Если бы начинать со строго типизированного языка, как Java, то эффективность обучения была бы в разы выше, но и порог вхождения бы тоже вырос, но не в разы. Но это в идеале, конечно. Сам я тоже с PHP начинал.
  • Как неопределенное поведение в javascript складывается на уровне V8?

    @xfg
    Вячеслав Юрьевич: Исключений точно не было, они появились в 3ей редакции EcmaScript от 1999 года. Быстро убедиться можно здесь https://developer.mozilla.org/en-US/docs/Web/JavaS...
    Ключевые слова да, были зарезервированы изначально на будущее.
  • Как неопределенное поведение в javascript складывается на уровне V8?

    @xfg
    Максим Иванов: Эйх где-то давал комментарий, что создал язык JavaScript за несколько дней с синтаксисом похожим на Java, только гораздо хуже, даже хуже, чем PHP, писал он.

    Я думаю, что с 1995 года все эти странности и тянутся. Исключений в Javascript в то время не существовало. Чуть позже язык был стандартизирован ассоциацией ECMA, так у нас появился стандарт ECMAScript и все эти странности мигрировали в него. Движки пишут по стандарту ECMAScript, поэтому мы и можем сегодня наблюдать все эти странности.

    Всем известно, что добавить новое всегда проще, чем исправить старое, так как, когда приходит осознание, то как правило уже написано огромное количество кода и если в одно мгновение всё это исправить, то тонны кода сломаются, тонны сайтов перестанут корректно работать и вообще неизвестно какой ущерб будет нанесен. Поэтому так и тянется. Javascript такой не один. В любом языке полно неточностей, которые точно также не исправляются десятилетиями.

    Никто же не знал тогда в 1995, что язык станет популярным. Его делали быстро и над качеством особо никто не думал. Тогда была война браузеров и нужно было быть впереди конкурентов.
  • Должен ли верстальщик заниматься созданием (разработкой) шаблонов страниц?

    @xfg
    Никита Кит: любой фронтендер умеет верстать. Ему не нужно просить верстальщика, что-то переделать, он сам все сделает за 1 минуту, не тратя время на обмен информацией с лишним звеном и поиск этого лишнего звена, которое где-нибудь в отпуске или еще так или иначе отсутствует на рабочем месте.

    Бэкендер не должен уметь садить любые отрыжки фронтенда. Он даже html/css/js не обязан знать. Он должен бизнес-логику писать, вникая в бизнес процессы той области для которой пишет ПО, думать об алгоритмах, всяких сложных вещах типа многопоточности и выкатывать документацию к написаному api.

    Человек, который шарит во всех цмсках и может натянуть на них шаблон - это не бекендер. Вообще. Никак. Совсем. Это что-то вроде веб-мастера, который "везде по чуть-чуть и толком нигде".