Apakah Node.js benar-benar meningkatkan skalabilitas?

21

Saya telah membaca tentang Masalah C10K, dan catatan khusus adalah bagian yang mengacu pada server I / O asinkron. http://www.kegel.com/c10k.html#aio

Saya percaya ini cukup meringkas apa yang Node.js lakukan di server, dengan mengizinkan utas untuk memproses permintaan pengguna sambil mengandalkan I / O interupsi (peristiwa) untuk memberi tahu utas pekerjaan yang selesai, daripada meminta utas bertanggung jawab atas pekerjaan CPU penuh. Utas dapat melanjutkan dengan hal-hal lain (non-pemblokiran), dan diberi tahu kapan suatu pekerjaan dilakukan (misalnya file ditemukan atau video dikompresi).

Ini selanjutnya berarti bahwa utas lebih tersedia untuk soket dan oleh karena itu bagi pengguna di server.

Kemudian saya menemukan ini: http://teddziuba.com/2011/10/stAPAN-talk-on-event-loops.html

Penulis di sini mengklaim bahwa meskipun kerangka kerja yang digerakkan oleh peristiwa (threading terputus), dapat membebaskan utas, ia sebenarnya tidak mengurangi jumlah pekerjaan yang harus dilakukan CPU! Alasannya di sini adalah bahwa jika, katakanlah, seorang pengguna meminta untuk mengompresi video yang mereka unggah, CPU masih harus benar-benar melakukan pekerjaan ini, dan akan memblokirnya saat melakukannya (demi kesederhanaan, mari kita lupakan tentang paralelisme di sini - kecuali jika Anda lebih tahu!).

Saya seorang programmer langsung, bukan admin server atau yang seperti itu. Saya hanya tertarik untuk mengetahui: apakah Node.j adalah hadiah dari para dewa 'komputasi awan' atau apakah semua ini adalah hawa panas, dan tidak akan benar-benar menghemat waktu dan / atau uang perusahaan dengan meningkatkan skalabilitas?

Terimakasih banyak.

Alex
sumber
12
Pertama ted adalah troll, kedua node.js dimaksudkan untuk aplikasi yang terikat IO bukan aplikasi yang terikat CPU. Yang Anda inginkan adalah kombinasi keduanya. Apa pun yang terikat CPU masuk ke utas / proses baru. IO-terikat apa pun berjalan dalam satu lingkaran acara.
Raynos
1
+! Orang itu pasti troll.
Patrick Hughes
Itu tergantung dengan apa yang Anda bandingkan - jika Anda masih menggunakan Apache (untuk beberapa alasan) - maka Node adalah hadiah dari dewa, tetapi jika Anda membandingkannya dengan Nginx - peningkatannya jauh lebih drastis, dan Node bahkan lebih lambat. (sepuluh kali lebih lambat, 2ms vs 20ms untuk menghasilkan respons, TETAPI dalam pengujian kami, Nginx memberi 504 di bawah beban yang cukup berat, dan Node memberikan respons normal).
c69
Sekarang Anda menyebutkannya teman-teman, orang troll jelas adalah troll. @ c69 itu info bagus, terima kasih banyak.
Alex
Tautan "obrolan langsung tentang acara" tidak lagi berfungsi.
Robert Harvey

Jawaban:

20

Tentu saja setiap pekerjaan yang terikat CPU akan memanfaatkan CPU. Ini akan memblokir CPU dalam bahasa atau kerangka apa pun yang Anda gunakan.

Node.js sangat bagus untuk ketika Anda memiliki I / O yang terikat pekerjaan, bukan CPU yang terikat. Saya tidak akan melakukan angkat berat di Node, meskipun itu bisa dilakukan. Node.js memecahkan masalah nyata , bukan yang fiksi atau imajiner seperti server bilangan fibonacci . Itu bukan "udara panas".

Josh K.
sumber
Hanya memeriksa beberapa tolok ukur dan memang sepertinya jauh lebih cepat dalam melayani halaman: zgadzaj.com/ ... .. Saya rasa inilah yang saya cari ...
Alex
3
@AlexW: Poin bagus tentang tolok ukur itu adalah Anda pada dasarnya menyajikan konten statis. Lihat karya Millions of Hits a Day saya . Memutar juru bahasa PHP untuk itu adalah pemborosan. Lihatlah sesuatu seperti simpul-statis untuk melayani direktori file.
Josh K
@AlexW, Sekadar mengingatkan bahwa zgadzaj.com/… menggunakan node.js 0.1.103, yang sudah tua sekarang !!
Samyak Bhuta
4

Sementara makalah C10K agak ketinggalan zaman sehubungan dengan detail implementasi, konkurensi berbasis peristiwa (model reaktor) masih dalam beberapa hal lebih unggul daripada penjadwalan preemptive. Sebagai contoh, model penjadwalan preemptive dapat menjadwalkan utas sementara mereka diblokir IO. Ini memungkinkan node (dan alat-alat lain seperti Mesin Acara Ruby dan Python Twisted) untuk lebih baik menggunakan siklus yang tersedia dengan menghabiskan lebih banyak waktu melakukan pekerjaan nyata dan lebih sedikit pemblokiran waktu.

Rein Henrichs
sumber
-1

Multithreading masih meningkatkan kinerja. Penjelasan asli ini bodoh karena tidak mempertimbangkan keberadaan banyak inti. Saat Anda memiliki lebih dari satu inti, utas bukan lagi utas. Mereka adalah hyperthreads. Setiap aplikasi thread intensif akan mendapat manfaat darinya lebih dari satu aplikasi threaded tunggal.

aanand_ub
sumber
2
Ini tidak benar-benar menjelaskan semangat Node.JS. Manfaat utama Node.JS adalah kemampuannya untuk dengan cepat menangani dan mengirim beberapa permintaan dari satu utas, untuk tidak secara efektif menangani beban kerja latar belakang yang berat, yang tidak dijawab oleh jawaban Anda.
Robert Harvey
Manfaat utama node.js adalah memiliki satu bahasa untuk front dan backend. Semua klaim lain ini hanya untuk membuatnya tampak lebih penting.
whatsisname
2
@whatsisname concurrency berulir tunggal adalah manfaat besar, jauh lebih besar daripada memiliki satu bahasa menurut saya.
mundur