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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.