Node.js IT 狗討論區

260 回覆
22 Like 35 Dislike
2022-01-04 12:26:43
chrome用libevent
nodejs用libuv

而且你話所有framework都有non blocking io,我唔係好認同
at least python java c#連rdbms大部份係blocking
JDBC interface直頭係全部blocking
2022-01-04 14:12:09
兩者嘅目的都係提供 non blocking io
背後都係用 kernel thread:
linux 行 epoll
unix 行 select
windows 就一個行iocp,一個行epoll,後來2個都行iocp

佢哋真正嘅分別係處理 microtask 嘅先後
HTML spec 關於event loop嘅規定係:
先搞掂哂micro task (e.g. promise)
然後再處理macro task (e.g. setimeout / setinterval)
但如果你將一個promise放入一個setimeout
2018年前嘅 nodejs 會將個promise降Lv變成macrotask
結果呢個promise可能要等其餘嘅settimeout處理哂先到佢run
settimeout可能係以分鐘計
個promise因此而suffocate
但nodejs v11開始已經修正咗
目前nodejs event loop同javascript event loop係一致

但以上只係兩者點implement event loop嘅問題
同event loop 嘅concept毫無關係
event loop 嘅concept從來都係以kernel thread作為底層IO
user level就用single thread處理task
而每個task都有機會令event loop block死
所以無論咩版本
block死event loop都係大忌

nodejs 用 event loop 嚟實現non blocking io
nodejs嘅其他對手(包括你提到嘅例子)一樣有
C# 5.0 開始有async await
java 8 開始有 completableFuture
python 3.4 開始有 asyncio
asp.net core 直頭同 nodejs 一樣用 libuv

JDBC 以至其他db API
唔知你提嚟做乜
呢啲API通常比其他runtime call嚟用
只要你個framework 有 async io
再用個runtime嘅 task / completableFuture / work thread / coroutine 嚟包實個 db query
每個 db query係blocking
但整個 web application 依然係 non blocking
完全睇唔出邊度有矛盾
2022-01-04 16:54:39
想請教吓golang goroutine同埋js promise係唔係兩樣好唔同嘅概念?
2022-01-04 22:28:00
因為每個function都有分synchronous同asynchronous

JDBC就係典型嘅synchronous function, 而且每個synchronous function call都會令到其他async function變成synchronous,就算用其他野wrap住,就算jdbc底層係non blocking io又好,都會型成bottleneck

R2DBC係spring提出,立志係取替JDBC型成嘅bottleneck,可惜係Java community迴響不大

C#就時不時有人直接用Task.Result, 搞到有bottleneck甚至deadlock

就係因為咁,nodejs嘅生態先顯得神奇,所有API day 1已經係用async function設計出嚟


BTW, ASP.NET Core 已經唔再建議libuv
https://docs.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/5.0/kestrel-libuv-transport-obsolete
2022-01-04 23:14:03
2022-01-05 07:55:12
而且每個synchronous function call都會令到其他async function變成synchronous
硬係有啲人 Promise.resolve(getFibonacci(100)) 就當自己 async 咗, 到發現 event loop被block死就投訴個framework寫得唔好。用 async construct 包住sync function嘅真正問題係 tie up user thread, 而唔係令其他async function 變返 sync。 包 sync function 包到block死 event loop 或 main thread 係低級錯誤, 係唔熟framework, 同 tie up user thread 根本係2個完全唔同嘅問題。 tie up user thread 呢啲係死症, 個個framework都有async db driver你唔用, 你一定要 legacy API 就自己睇路, 咩framework都幫唔到你。

C#就時不時有人直接用Task.Result, 搞到有bottleneck甚至deadlock
呢啲又係低級錯誤, code review 叫佢記得 async all the way, UI thread 要ConfigAwait(false) 之類, 再犯就炒得。

就係因為咁,nodejs嘅生態先顯得神奇,所有API day 1已經係用async function設計出嚟
13年前或者係, 但今時今日一街都係web framework, 全部by default async io, 再吹奏呢樣嘢, 同你30歲仲吹奏自己中學係名校有乜分別 ?

BTW, ASP.NET Core 已經唔再建議libuv
咁不如你再睇多啲,佢哋用咩嚟代替 libuv, 點解,同埋結果。
asp.net core 嘅 event loop 放棄咗 libuv loop, 用 c# 重寫。
點解個event loop要重寫 ?因為 libuv 仲係用 linux thread pool去處理disk IO (包括db) / network IO, 而無用到 linux 嘅 aio。
Linux AIO 透過 batching send/recv in networking IO (同 disk IO 嘅batching 原理一樣) 去減少 IO 嘅overhead, performance 高於 thread pool。
結果就係 libuv 嘅 IO 慢過 kestrel, 亦係nodejs喺performance上輸比asp.net core嘅其中一個原因, 某啲 benchmark 有3X 嘅分別。


但快又如何,單靠呢啲web framework都食唔到真正嘅大茶飯。
如果將 complex system 比喻為一間酒樓, asp.netcore / nodejs 呢啲web framework就好似門口嘅知客, 負責派飛帶位,偶然收下銀,僅此而已。以前啲經理on99叫知客落場斟茶, 推點心車,甚至入廚房煮飯, 門口梗係排長龍, 客人等等吓咪走人囉。
microservice / step function (aws) or durable function (azure) 都係解決呢類問題嘅其中一個辦法, 總之個結論係 nodejs is good but it's not that good, asp.net core is great but it won't be tomorrow.
2022-01-05 09:46:06
其實有咩好爭
隻隻lang/framework 都一定有佢自己既優點缺點
揀隻最合適既就OK
2022-01-05 09:53:51
Goroutine係multi thread(green thread)
Node js 係single thread + event loop
當你做cpu bound task嘅時候就算你用promise包住佢都係sequentially咁行
2022-01-05 10:55:17
真。。寫黎寫去未又係果d 野
2022-01-05 10:57:04
都係crud/連返DB
caching
queue job/cron job
cicd
test case
隻隻lang/framework都有相應lib做
2022-01-05 10:58:16
咪之係用唔同螺絲批,士巴拿,我用自己隻螺絲批,你鐘意咪用多幾支囉
2022-01-05 11:00:26
agger
所以有時做野都唔洗話寫D 好low level既lang
c++/go/rust 做backend 都唔一定需要
node/python/ruby/java/c# 而家好多都夠玩
而且cloud方面好多野都support得到 唔會點死
2022-01-05 11:20:21
現實世界就係我請個js 人易好多 full stack 乜都寫到 dev time又短已經贏左你system performance 咁多open src community 你要做嘅effort 少好多出貨又快

同埋我已經唔明microsoft想做d 咩 年年都大改
2022-01-05 11:36:42
ching 心水清
2022-01-05 11:37:31
其實個 post 係想比寫 node.js 既 p 仔討論下技術,但突然變左 lang 大戰
2022-01-05 11:42:51
其實有時performance vs dev time呢樣嘢
真係視乎做乜規模project
2022-01-05 11:44:05
如果啲大戰畀我呢啲花生新手學到嘢, 都ok
唔識multi-thread, async嘢
2022-01-05 12:15:27
我都學到好多野 連登卧虎藏龍
2022-01-05 12:34:21
2022-01-05 12:43:00
我唔覺得asp.net core/spring/django/node 之間會有決定性嘅分別,system architecture 先係最重要。 你去big tech見工根本唔care language,用algo淘汰一班柴娃娃之後就直接進入system design (除非你係fg無system design經驗)。 工具無優劣,功力有高下
2022-01-05 12:48:09
其實啲觀點無矛盾,唔算駡戰,純粹互相補充。
2022-01-05 12:56:07
岩,巴打對 node.js 既理解好深入
2022-01-05 13:04:04
其實都好貼題,node js將之前好麻煩先做到嘅async execution變成主流,樓上師兄講番成個生態(唔止app, 連system都cover埋)嘅前世今生,真係開眼界
2022-01-05 16:42:41

正常除左公司個老闆之外...無邊個寫node既developer會相信Nodejs是萬能...
隨便插Nodejs應該都無咩人會為佢心痛
2022-01-05 16:51:25
有好麻煩嗎...
從一開始揀javascript已經成功左一半
老一輩Developer應該會仲記得當年MEAN stack大行其道...
講完都覺得自己有D老

NodeJs最初就強調Data Intensive Real-Time application
連同MongoDB一齊食正Big Data條水
吹水台自選台熱 門最 新手機台時事台政事台World體育台娛樂台動漫台Apps台遊戲台影視台講故台健康台感情台家庭台潮流台美容台上班台財經台房屋台飲食台旅遊台學術台校園台汽車台音樂台創意台硬件台電器台攝影台玩具台寵物台軟件台活動台電訊台直播台站務台黑 洞