Демон для обработки очереди

fixxxer

К.О.
Партнер клуба
@grigori, про колбэки уже можно забыть. Репозиторий - npm с 5-й версии (или когда там package.lock появился) уже не такой и безумный. Плюс есть yarn, он вообще как composer почти.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
недавняя история, когда борцуны за безопасность выпилили сотню известных пакетов, и под именем этих пакетов народ залил собственный код - это именно безумный репозиторий
 

fixxxer

К.О.
Партнер клуба
В npm допустили все ошибки, какие только можно допустить, проектируя репозиторий, это да. Но уже лучше намного.

Yarn ок, почти нормальный, им бы еще их дурацкую эвристику на нормальный SAT solver заменить, и будет прям composer. (Удивительно, что сразу его не сделали, фейсбук же, зря что ли на собеседованиях по алгоритмам всех гоняют? :D )
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Мне честно говоря, полная асинхронность кажется лукавством, просто потому что бизнес-логика более-менее сложного процесса обычно довольно линейная. Да, можно какие-то простые вещи готовить и отдавать клиенту асинхронно, какие-то независящие друг от друга операции паралеллить, но в конечном итоге на более-менее сложной бизнес-логике в тру-асинхронном подходе ты просто получишь unmaintainable callback hell. Поэтому асинхронным мы стараемся делать то, от асинхронности чего есть явный понятный профит — как например, сетевые соединения обслуживать, или большие наборы данных отдавать. В случае с бизнес-логикой поддерживаемость и понятность кода куда важнее. (И тестируемость! вы пробовали тестировать асинхронщину?))
 

fixxxer

К.О.
Партнер клуба
Мне честно говоря, полная асинхронность кажется лукавством, просто потому что бизнес-логика более-менее сложного процесса обычно довольно линейная. Да, можно какие-то простые вещи готовить и отдавать клиенту асинхронно, какие-то независящие друг от друга операции паралеллить, но в конечном итоге на более-менее сложной бизнес-логике в тру-асинхронном подходе ты просто получишь unmaintainable callback hell. Поэтому асинхронным мы стараемся делать то, от асинхронности чего есть явный понятный профит — как например, сетевые соединения обслуживать, или большие наборы данных отдавать. В случае с бизнес-логикой поддерживаемость и понятность кода куда важнее. (И тестируемость! вы пробовали тестировать асинхронщину?))
Смотря что понимать под асинхронщиной.

Если говорить о классическом libevent style коде с пачкой колбэков, то, конечно, сложность его поддержки должна быть оправдана. Это действительно адок.

А если язык/библиотеки/фреймворк позволяют с ней работать так же легко, как и с синхронным кодом, то не вижу вообще никакой разницы - при этом имеется весь профит от мультиплексирования.

Если брать за пример современный JS или Typescript, то вся асинхронщина изолируется в асинхронных функциях, на уровне инфраструктуры и http-слоя. Работа с асинхронным кодом в асинхронных функциях выглядит ровно так же, как и с синхронным - просто добавляется "магическое" ключевое слово await. Ну и, конечно, там где-то есть return new Promise, но это все в 99% случаев исходит изнутри библиотек (датамаппера, сетевого клиента итд), вручную почти никогда не надо писать. При этом если в каком-то месте надо действительно распараллелить - именно в этом месте уже можно поработать с пачкой promise-ов и опять же свести к return promise, на который выше будет await. В общем, в том же nestjs код практически не отличается от обычного синхронного - просто добавь async / await. (UPD: с тестами - ровно так же. async ... expect(await foo()).toBe(bar)).

Слой domain model при этом, разумеется, синхронный - в нем ведь нет никакого io, зачем это там? Проблемы тут будут, только если использовать паттерн ActiveRecord, или иным образом смешивать domain layer с инфраструктурой. А не надо так делать.

Еще может быть проблема с интенсивными cpu операциями, с тяжелыми вычислениями. Но это крайне редкий случай, тут с любым подходом будут свои проблемы, которые сами по себе не решаются вне зависимости от.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
интенсивные по CPU операции выносятся в backend и решаются или через map/reduce, или очередью, или уменьшением точности, но это уже совсем не про ноду

а вот для чего нода лучше - пока вижу только websocket-ы
в middleware получается классический tradeoff: сложнее деплой, сложнее дебаг, сложнее управление памятью, нет overhead на инициализацию приложения на каждый запуск
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
возвращаясь к теме фоновой обработки, https://12factor.net/concurrency
HTTP requests may be handled by a web process, and long-running background tasks handled by a worker process

я просто не понимаю как в ноде устроить взаимодействие между web process и background workers
в php - тоже не очень понимаю,
в golang и python - понимаю
 

Adelf

Administrator
Команда форума
Я же отвечал на это уже. На первой странице.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@Adelf, про "задачу в очередь" (в базе?), ZMQ, и http client я помню, но "очередь" - это +1 сервис в архитектуру (api/setup/maintain/failover), а ZMQ течет
 
Последнее редактирование:

флоппик

promotor fidei
Команда форума
Партнер клуба
это +1 сервис в архитектуру (api/setup/maintain/failover)
Ну у тебя в любом случае это будет +1 слой в архитектуру, так или иначе.
Вариантов в принципе, не так уж много, и они в основном такие же, как в других языках.
1. Полноценная очередь c ack пакетов: ZMQ, Gearman, RabbitMQ, Aws SQS, Redis pub-sub, pure-database и тд. Дополнительным бонусом тут language-agnostic исполнители — надо на питоне обработчик написать, или на го — взял и написал.
2. Асинхронщина с евенлупом создающая задачи, и отдающая их, и синхронщина спрятанная по http, где мультиплексацией занят нджинкс. Плюсы — за хттп стоит знакомый стек и программисты по писят рублей ведро. WEB SCALABLE!1
3. Форкаемся прям в пхп, обмениваемся данными через tcp-/unix-сокеты, shm, или кем-то из 1 пункта. Плюсы — кодовая база вся в одном месте.
4. Ваш вариант.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
как я понимаю, уровень поддержки разных платформ-языков, в целом, лучше всего у редиса
 
Последнее редактирование:

fixxxer

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