LINUX.ORG.RU

Смысл в Node.js

 , ,


0

4

Посоны, какой смысл использовать ноду в бекэнде? Я ещё как-то понимаю смысл ноды в связке с electron или NW, но в остальном это извращение... ИМХО. Какой профит от ноды в сравнении с golang например.

P.S. Просто сейчас молодежь помещена на Node.js, просто может я уже пробзделый программер?


Ответ на: комментарий от Shadow

А потом выясняется, что широкий круг задач, включая SQL хранилища, совершенно синхронны, а с асинхронной частью справляется nginx.

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

dzidzitop
()
Ответ на: комментарий от slaykovsky

Spring-быдлокодеры начали тонуть в тоннах созданного им говна? Устали, бедненькие. Нужно на новой полянке из Go новые тонны говна создавать.

Это как-то так работает на сегодняшний день.

dzidzitop
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от Shadow

Проблема именно в синхронном API. Нет таких задач, логика которых не может выполняться асинхронно. Более того, любой объём работы со величине и видам можно поместить в event loop и освободить поток, который её туда поместил, для других задач.

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

Если не согласен, то приведи пример задачи, которая не может выполняться в event loop (отдельными этапами).

dzidzitop
()
Ответ на: комментарий от dzidzitop

выполняться в event loop

Конечно может. Только вместо:

задание1 -> задание2 -> задание3

мы пердолимся с:
задание1
вотчер на задание1 готово -> задание2
вотчер на задание2 готово -> задание3

что по сути то же самое, что синхронное, только БОЛЬШЕ процессорных инструкций почти в 3 раза, и единственное «облегчение» у нас - свободный основной поток. Ну и почти в три раза больше мест на ошибку.
Ну так это реализовано в других языках тредами, например.

И да, пусть даже асинхронный join трёх таблиц, например, часто может оптимизироваться СУБД гораздо хуже, чем два последовательных. А где последовательные обращения к СУБД, там асинхронщина пропадает и становится оверхедом.

Shadow 👍👍👍👍👍
()
Последнее исправление: Shadow (всего исправлений: 5)
Ответ на: комментарий от slaykovsky

Ну ты же знаешь, что есть несколько способов обхода gil, когда он мешает, вплоть до «питон тут не нужен». В остальных случаях питон нужен.

Shadow 👍👍👍👍👍
()
Последнее исправление: Shadow (всего исправлений: 1)
Ответ на: комментарий от rumgot

удобно ведь, когда один язык

Нет, гораздо удобнее, когда одинаковое поведение оператора сравнения, одинаковые типы и т.п., и даже не в разном софте или средах, а в блок-схеме, нарисованной на бумажке, и в коде.
Синтаксис даже не вторичен.

Shadow 👍👍👍👍👍
()
Ответ на: комментарий от Shadow

Ну так это реализовано в других языках тредами, например.

А теперь покажи, как ты на среднепаршивом сервере запускаешь хотя бы миллион тредов.

x3al
()
Ответ на: комментарий от Shadow

Зачем?

Зачем ждать ответа от нескольких баз данных параллельно для каждого из уймы клиентов? Даже не знаю, зачем, млин.

nginx — замечательно, но он же не один (ну, если нагрузка детская — одного хватит, да) и он не работает с БД напрямую обычно.

x3al
()
Ответ на: комментарий от Shadow

Я и не говорил, что он не нужен :) Мне нравится питон, мне не нравится поддерживать тонны легаси говна на питоне :)

slaykovsky
()
Ответ на: комментарий от Shadow

задание1 вотчер на задание1 готово -> задание2 вотчер на задание2 готово -> задание3

Есть же RxJS/RxJava, даже что-то там из RxJS в стандарт должно войти.

slaykovsky
()
Ответ на: комментарий от silver-bullet-bfg

Если забыть, что есть Rust и Pure C.

При всей моей любви к сишке, в ней из коробки нет корутин.

kawaii_neko
()
Ответ на: комментарий от drsm

Всё это было и с коллбэками. Только гемор с объединением параллельных данных очевиднее (т.е. меньше шансов написать совсем уж нечитабельный код), насколько могу судить.

dzidzitop
()
Ответ на: комментарий от Shadow

Асинхронными должны быть не джойны, а ожидание result set и вычитка из него записей. А сама база может работать как угодно.

Т.е. SQL не меняется в угоду асинхронщины, меняется API для вычитки данных из базы с resultSet = query(sql); resultSet.next()/resultSet.next()/resultSet.next() на query(sql, resultSetRecordCallback).

dzidzitop
()
Ответ на: комментарий от menangen

Когда появится что-то для языков, с которыми я работаю, то посмотрю подробнее.

Но, в общем, молодцы, если создают. Единственное что, вот это точно говно:

values = await conn.fetch('''SELECT * FROM mytable''')
В таблице может быть 10^8 записей. Асинхронная итерация по result set должна быть, а не такое.

А скальный автор вообще примеров использования не предоставляет.

dzidzitop
()
Ответ на: комментарий от dzidzitop

В этом и смысл. Чтобы код был простой и понятный.

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

Vit
()
Ответ на: комментарий от dzidzitop

Если не согласен, то приведи пример задачи, которая не может выполняться в event loop (отдельными этапами).

Любые тяжелые вычисления. Особенно когда из-за них кончаются ресурсы ядра.

Vit
()
Ответ на: комментарий от dzidzitop

Ну дык поищи интерфейс курсоров в драйвере. Возможно автор не счел нужным описывать очевидные вещи.

Vit
()
Ответ на: комментарий от Vit

Python не пользую, так что подожду что-нибудь для языков, которые использую.

dzidzitop
()
Ответ на: комментарий от Vit

Собирать по кускам инфу из этих promise.all - абсолютно та же самая задача. Но если после этого гарантированно вызывается общий колбэк (ну или какой там сахарок его заменяет), то в общем жить (в муках) можно.

dzidzitop
()
Ответ на: комментарий от Vit

Да и то подобная жизнь, особенно в контексте NoSQL, часто означает выгребать половину базы данных для последующей склейки/обработки.

dzidzitop
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от dzidzitop
let [a, b, c] = await Promise.all([
  query_a(),
  query_b(),
  query_c(),
])



Разберись как промисы работают. Ты себе чего-то левого нафантазировал.

Vit
()
Ответ на: комментарий от dzidzitop

IMHO ты на какие-то абстрактные вещи съезжаешь. async/await решают проблему с колбеками. Колбеков нет, логика линейная. То как эту фичу применять или не применять - личное дело каждого.

Для больших выборок из баз делают курсоры и стримы, но это не имеет абсолютно ни какого отношения к async/await.

Vit
()
Ответ на: комментарий от Vit

Посоны, как правильно и красиво сделать динамическое обновление дива в электроне? Нужно просто обновлять его каждую секунду.

AUX
() автор топика
Ответ на: комментарий от AUX

Я не пишу активно под электрон и не держу в голове что там как. Пойди на крайние меры, загугли примеры и tutorials. Рендереры с DOM там отдельными «окнами», не в главном процессе который запускается.

Vit
()
Ответ на: комментарий от Shadow

C радостью, но мучаю элетрон, но пока кроме трудностей нечего полезного :(

AUX
() автор топика
Ответ на: комментарий от AUX

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

Vit
()
Ответ на: комментарий от Vit

Я «нафантазировал» живой код в недалёком прошлом с гроздями зависимых запросов из одной молодой, но перспективной хипстерской NoSQL базы данных. И код там или очень нелинейный и, соответственно, на колбэках или работать будет с кучей вспомогательного бойлерплэйта и с последовательным выпуском новых и новых запросов, соответственно, с большой задержкой и бОльшим потреблением памяти.

dzidzitop
()
Ответ на: комментарий от dzidzitop

Ответь пожалуйста на один простой вопрос. Какое отношение то что ты написал имеет к async/await? Видишь ли, я могу отвечать на конкретные вопросы, если в них разбираюсь. Но не вижу смысла о чем-то спорить или чатиться за жизнь. Не интересно как-то.

Vit
()
Ответ на: комментарий от dzidzitop

хипстерской NoSQL
на колбэках
вспомогательного бойлерплэйта

Это настоящая крутизна, однозначно.

King_Carlo
()
Ответ на: комментарий от Vit

Представленный выше async/await ничем не помогает в реальной жизни асинхронного программирования. Он всего только уменьшает глубину дерева асинхронных событий в исходном коде на единицу (строго на единицу).

Инструменты типа https://www.npmjs.com/package/async (= Promise.all в стороне от await) полезнее, но в общем тоже беда-печаль в живом типичном web-приложении на Node.js + NoSQL. Ибо всё так же не влияют на глубину дерева асинхронных событий и не избавляют от бремени склейки промежуточных результатов.

dzidzitop
()
Последнее исправление: dzidzitop (всего исправлений: 2)
Ответ на: комментарий от awesomebuntu

Ты серьезно думаешь что чел, который писал ноду несколько лет, тешил себя все то время единственной мыслью, как он смачно лизнёт за бесплатно очилы всех работодателей к сокращениям расходов на зарплаты жеесеров?

Это же просто больная фантазия автора, заразившая жеесеров мыслью «мы теперь и в бекенд сможем!».

P.S. для всех: Я ничего против качества кода самой ноды не имею, оно вполне работоспособно. Мы тут говорим о целях поделки.

deep-purple
()
Ответ на: комментарий от dzidzitop

async/await позволяют сохранить бизнес логику ровно в том виде, в котором она есть. Не упарывая ее колбеками.

А о прелестях caolan-овской библиотеки для колбеков ты пытаешься рассказывать тому, кто ее использовал много лет, и потом съехал на промисы с генераторами и впоследствии async/await. Разница в удобстве - огромная. На ветвлениях это сразу заметно. И это реальный опыт, а не заключения из наблюдений за интернетами.

Бремя склейки промежуточных результатов - вопрос бизнес-логики или интерфейса драйвера, и ни каким местом не связано ни с async/await, ни с нодой ни с nosql.

Vit
()
Последнее исправление: Vit (всего исправлений: 2)

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

Ну и проще становится налепить гордую лычку «фуллстек» программист.

leave 👍
()
Ответ на: комментарий от Vit

Разницы никакой, кроме синтаксической. На всех трёх проектах из трёх, на которых имел дело с Node.js обязательно была минимум одна многочасовая сессия отладки логики ровно в том виде, в котором она выполняется в рантайме.

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

А по теме: от Node.js + NoSQL советую держаться подальше. Ничего из A.C.I.D. (Atomicity, Consistency, Isolation, Durability) как информационная система она не обеспечивает. Зато обеспечивает долгие часы отладки при попытке реализовать хоть сколько-нибудь нетривиальные требования (= отличные от create/update/delete/get_by_id). Adieu.

dzidzitop
()
Ответ на: комментарий от dzidzitop

Разницы никакой, кроме синтаксической.

IMHO это глупость полная, которую на полном серьезе может утверждать только человек с очень небольшим или нулевым опытом использования async/await. Код с ними читать на порядок проще, чем с колбеками. Писать тоже. Я перегонял с колбеков много кода, сначала на генераторы, потом на async/await, разницу представляю очень хорошо.

Vit
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.