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.
sumber
Jawaban:
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".
sumber
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.
sumber
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.
sumber