These are chat archives for NodejsRUS/chat

15th
Mar 2016
Andrey Gurtovoy
@jt3k
Mar 15 2016 07:40

посоны вот скажите как быть.

писал проектик на ноде с нуля. Она норм работала, пока не пришёл мальчик-коллега и не начал делать задачку.

Тепер этот проект тормозит и работает не корректно. тесты писать уже поздно...

Vadim Petrov
@imposibrus
Mar 15 2016 07:42
@jt3k система контроля версий? Посмотреть, что он сделал? Откатить?
Andrey Gurtovoy
@jt3k
Mar 15 2016 07:42
Чел уже переключился на другую задачу и его эти проблемы перестали волновать
Maxim Zavitaev
@MaximZavitaev
Mar 15 2016 07:43
@jt3k ну так и спрашивают почему Git не используешь
Andrey Gurtovoy
@jt3k
Mar 15 2016 07:46
там адов говнокод в синхронном стиле
и там несколько задач
откатывал и проверял.
откатаное работает нормально
Vadim Petrov
@imposibrus
Mar 15 2016 07:47
@jt3k там вам подсказать изящные методы наказания нерадивого сотрудника?) или что?)
Andrey Gurtovoy
@jt3k
Mar 15 2016 07:47
я думаю перейти на схему с пуллреквестами
ну да.. ) помягче коллеге заявить что его код с душком и чтоб больше не трогал его так уверенно.
Vadim Petrov
@imposibrus
Mar 15 2016 08:01
@jt3k ну вот мы в компании, например, дург-друга постоянно троллим на тему говнокода. никто особо не обижается. но тут есть момент: понимает ли ваш сотрудник, что это говнокод? если да, то была ли причина его писать (сроки, например)? если причина была, то стоит (понять и простить) заложить немного времени на рефакторинг в будущем (возможно коллективный). если причины не было, то использовать методы воздействия. например, объяснить менеджеру проблему (плохо написали - тормозит/падает, надо переписывать), он сам спросит "кто виноват?".
если сотрудник даже не понимает, то стоит объяснить, возможно наладить code review (как вы и хотите - pull-request'ами).
disclaimer:
это лишь мое личное мнение, я никогда больше чем 3мя программерами не руководил и это могут быть не очень то и полезные советы)
Михаил
@muxahuk
Mar 15 2016 13:38
Не знаю как вы, я бы подошёл и сказал, что то что он написал - очень плохой код и впредь, что бы советовался до того как трогать мои проекты, особенно если он написал и свалил типо не при делах.. Собственно у меня есть 1 "подчинённый" который слаб в написании кода для ноды, но у нас есть договорённость, мол он коммитит в отдельные ветки, я потом проверяю и указываю на ошибки. Пока такая схема работает.
Михаил
@muxahuk
Mar 15 2016 14:21
а по поводу ХТТП протоколов никто ничего не подскажет ( см. вопрос выше ) ?
Vadim Petrov
@imposibrus
Mar 15 2016 14:44
This message was deleted
Vadim Petrov
@imposibrus
Mar 15 2016 15:02
@muxahuk я вчера ради интереса решил посмотреть этот вопрос. У вас, я так понял, клиенты - браузеры. А в них кол-во поддерживаемых протоколов и уровень доступа к ним не велик. На выбор: http, websockets, webrtc (webrtc - это технология, а как протокол называется - хз). может есть еще, но я о них не в курсе. поддерживают двустороннее общение из них websockets и webrtc. в http можно добиться этого с помощью long-polling или server-sent events, но это, на мой взгляд, вам не подойдет. в среднем по больнице поддержка webrtc и websockets примерно одинаковая (может webrtc чуть меньше). потестировал вчера webrtc на ноде (пакет wrtc), их dataChannels. нагрузка на проц была раз в 3-5 больше, чем с ws (очень странно на мой взгляд, но эти синтетические тесты такие синтетические). пробовал также, как и вы, через JSON.stringify передавать маленькие объекты. отсюда вывод - дальше оптимизировать некуда. если только самому изобретать велосипед, но не факт, что это будет быстрее (пример).
Михаил
@muxahuk
Mar 15 2016 16:28
@imposibrus понятно. спасибо за проделанную работу. Значит что бы снизить нагрузку остаётся только уменьшать кол-во отправляемых пакетов на сервер или расширяться по горизонтали ( кстати, как ws в этом плане ? )
Vadim Petrov
@imposibrus
Mar 15 2016 16:56
@muxahuk если честно, голый ws нииразу не пробовал масштабировать, но с websockets схема всегда одинаковая - каждый сервер на своем порту, перед ними стоит балансировщик, например, nginx, который балансит по ip. Это схема "в лоб", более изящной сейчас не придумаю)
Михаил
@muxahuk
Mar 15 2016 17:00
@imposibrus а как быть если мне нужно "держать" пользователей всех вместе ? вроде бы есть какой-то reddis для этого ? в плане у меня каждый сервер должен знать какие клиенты есть вообще на всех серверах. ws это поддерживает или нужно будет колдовать ?
Vadim Petrov
@imposibrus
Mar 15 2016 17:11
@muxahuk колдовать в любом случае) Redis - key=>value база данных, быстрая. Ее можно использовать как хранилище данных и связку между серверами ws. Плюс скорее всего через Redis же придется реализовать pub/sub (канал общения между серверами, гуглится все за пару минут). Есть для этого хорошее решение для ноды, сейчас не найду, потом. И, если вам надо, при входящем сообщении от пользователя, отправить сообщение всем остальным пользователям (которые крутятся на других серверах), то другим серверам надо об этом сообщить (как раз через удобный pub/sub). Если вы понимаете мою мысль через слово, то придется много подучить) это стандартная схема.
Михаил
@muxahuk
Mar 15 2016 17:18
@imposibrus у меня скорее другая задача, при входящем сообщении двигать пользователя по миру, а затем вытаскивать всех пользователей, которые оказались в его поле видимости, и уже у них вытаскивать разные данные и отправлять обратно пользователю. Но это ещё не скоро буду делать ( редис ставить ). Ок, спасибо.
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 18:30
@muxahuk socket.io отлично интегрируется с redis "из коробки"
Михаил
@muxahuk
Mar 15 2016 19:00
@JustBlackBird да, я видел модуль для сокета. Но пока что остаюсь с модулем ws, т.к. он меньше нагружает ЦП. Я попробую написать весь ( ну или основной ) функционал и заменить ws на socket ( то как я пишу сейчас должно упростить этот переход ). Обязательно попробую и так и так и этак )
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:04
@muxahuk я уже миллион раз говорил тебе, что ты ерундой занимаешься. так нагрузка на цп, которую ты получаешь не имеет смысла. это даже не синтетический тест. твой реальный функционал приложения будет жрать куда больше чем те копейки, которые ты сэкономишь на преждевременной оптимизации. но, как говорится, каждый сам кузнец своего геморроя.
Михаил
@muxahuk
Mar 15 2016 19:10
@JustBlackBird скажем так: есть продукт очень похожий на тот что я делаю, но у него проблема - он не скелиться ( т.е. нельзя запилить новый функционал как и куда нужно из подмодуля ). Я, грубо говоря переделываю его так, что бы из любого модуля/подмодуля можно было изменить функционал, отредактировать, отфильтровать ту или иную переменную. Вообщем из-за того, что я начал переделаывать с сокетом, а у них на ws работало - даже при убирании всего моего функционала(!!!!) ( кроме открытия сокет соединения ) у меня нагружалос ЦП больше, чем у них со всем функционалом. Ну собственно и приходиться делать рефакторинг так, что бы это всё ело меньше ресурсов ЦП.. т.к. задача сделать функционал быстрее и лучше, чем уже реализованно у других, но при этом что бы можно было расширить как и где угодно что угодно.
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:23
эм... подмодули на то и подмодули чтобы быть строительными блоками для приложения в целом
как бы DIP
Михаил
@muxahuk
Mar 15 2016 19:25
@JustBlackBird ну вот.. а у них всё в 1-у кучу написано, подмодулем никак не расширишь функционал
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:25
ладно. будем считать, что я просто не в теме =)
а что касается масштабирования, одним вертикальным вы не отделаетесь. стоит сразу думать о масштабировании по горизонтали
Михаил
@muxahuk
Mar 15 2016 19:28
@JustBlackBird ну вот например я реализовал модуль ВебСервер, он из себя ничего кроме 404 не представляет, но у него стоит несколько эмиттеров в которые можно подключить свой функционал из подмодуля. Так я подключаю разные страницы: каждая страница свой подмодуль, у которой есть возможнасть добавить не только путь ( /page_slug ) к ВебСерверу, а так же вывести определённые скрипты, стили ( с зависимостями ), блоки в лэйаут и т.п.
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:29
модули нижнего уровня не должны отвечать за построение приложения
композиция должна заканчиваться на уровне приложения
Михаил
@muxahuk
Mar 15 2016 19:30
ну, а чем плох мой подход ?
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:31
давать возможность низкоуровневым модулям менять поведение приложения в целом можно только в одном случае -- если модули низкого уровня пишутся сторонними разработчиками (плагины).

ну, а чем плох мой подход ?

если я правильно понял, то ты хочешь вывернуть приложение на изнанку

Михаил
@muxahuk
Mar 15 2016 19:32
@JustBlackBird вот это я как раз и реализую. У меня главный функционал предоставляет всё, что бы плагины могли добавить свой функционал
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:32
простой вопрос: как конфигурация попадает в модуль нижнего уровня?
плагины имеет смысл использовать только тогда, когда сторонние разработчики будут заниматься расширением системы каждый под себя. строить всю архитектуру приложения только на плагинах - бред. рано или поздно ты потонешь в зависимостях, потому что такая архитектура противоречит принципам инкапсуляции и единственной зависимости
блин, неужели в JS сообществе так непопулярны идеи модульности из нормального ООП мира? =)
Михаил
@muxahuk
Mar 15 2016 19:36
@JustBlackBird каждый подмодуль расширяет абстрактный класс SubModule в котором есть поинтер на разные глобальные модули ( веб сервер, базу данных, и т.п. )
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:36
и чем это лучше глобальных переменных?
если рассматривать каждый модуль как черный ящик, то для тестирования нужно замокать все зависимости (веб сервер, базу, и т.д.)
Михаил
@muxahuk
Mar 15 2016 19:37
все главные модули захоркодены
база, веб сервер, сокет сервер и т.п.
подмодули могут добавить только в них свой функционал
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:38
я проповедую путь, когда все зависимости спускаются в сущности сверху. глобальные переменные -- зло.
Михаил
@muxahuk
Mar 15 2016 19:39
ну.. у меня нету глобальных переменных
я не очень понимаю твою мысль и почему мой подход не правильный...
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:40
есть. если каждый модуль получает ссылки на все сущности разом, то это ничем не отличается от глобальных переменных
а что касается подхода, кмк, рано или поздно наступит момент, когда ты не сможешь больше оперировать всеми связями модулей низкого уровня.
высокая связность, все дела
Михаил
@muxahuk
Mar 15 2016 19:42
const masterServer = new MasterServer( configs );
/**
 * Если нам нужны стороние модули ( совместимые с нашим приложение ), то подключаем их тут
 * Пример:
    const 3rdPartyModule = require( '3rdPartyModule' );
    3rdPartyModule( masterServer );
**/
masterServer.start( ( ...args ) => {
        /**
            3rdPartyModule.start( ...args );
        **/
    } );
@JustBlackBird у меня подмодули друг к другу не оперируют
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:43
ок. у тебя есть два подмодуля, которые вместе меняют функционал сервера. как ты собираешься изолировать их при тестировании?
Dmitriy Simushev
@JustBlackBird
Mar 15 2016 19:49
и где гарантии, что их действия не накладываются друг на друга и они не меняют один и тот же функционал? похоже, что нужно тестировать приложение в целом. и да, модульности больше нет, все зависит от всего.
Михаил
@muxahuk
Mar 15 2016 20:01
@JustBlackBird ну, как бы проблему вижу. Но тот кто использует данную технологию должен следить за тем какие модули он подключает и понимать что они такое и для чего. В частности это я и плагины пишу тоже я. В свободный доступ не планировал заливать проект. А вся эта плагийность затеяна с той целью, что бы было легче редактировать те или иные части кода и мочь написать новый функционал легко.
"не накладываются друг на друга и они не меняют один и тот же функционал?" вот это я представить не могу ( устал за весь день, думать лень ). Приведи пример пож.