Perbedaan mode Cluster dan Fork di PM2

92

Saya telah mencari banyak untuk mencari tahu pertanyaan ini, tetapi saya tidak mendapatkan penjelasan yang jelas. Apakah hanya ada satu hal yang membedakan aplikasi berkerumun dapat diskalakan dan aplikasi bercabang tidak bisa?

Situs publik PM2 menjelaskan mode Cluster dapat melakukan fitur ini tetapi tidak ada yang mengatakan tentang kelebihan mode Fork (mungkin, ini bisa NODE_APP_INSTANCEbervariasi).

Saya merasa Cluster mungkin menjadi bagian dari Fork karena Fork sepertinya digunakan secara umum. Jadi, menurut saya Fork berarti hanya 'proses bercabang' dari titik PM2 dan Cluster berarti 'proses bercabang yang dapat diskalakan'. Lalu, mengapa saya harus menggunakan mode Fork?

Jinyoung Kim
sumber

Jawaban:

124

Perbedaan utama antara fork_modeand cluster_modeadalah perintah pm2 untuk menggunakan api child_process.fork atau api cluster .

Apa artinya secara internal?

Mode garpu

Ambil forkmode sebagai proses dasar pemijahan. Hal ini memungkinkan untuk mengubah exec_interpreter, sehingga Anda dapat menjalankan phpatau pythonserver dengan pm2. Ya, exec_interpreteradalah "perintah" yang digunakan untuk memulai proses anak. Secara default, pm2 akan digunakan nodesehingga pm2 start server.jsakan melakukan sesuatu seperti:

require('child_process').spawn('node', ['server.js'])

Mode ini sangat berguna karena memungkinkan banyak kemungkinan. Misalnya, Anda dapat meluncurkan beberapa server pada port yang telah ditetapkan sebelumnya yang kemudian akan diseimbangkan muatannya oleh HAProxy atau Nginx.

Mode cluster

The clusterhanya akan bekerja dengan nodeseperti itu exec_interpreterkarena akan akses ke nodejs klaster modul (misalnya: isMaster, forkmetode dll). Ini bagus untuk manajemen proses tanpa konfigurasi karena proses tersebut secara otomatis akan bercabang dalam beberapa contoh. Misalnya pm2 start -i 4 server.jsakan meluncurkan 4 instance server.jsdan membiarkan modul cluster menangani load balancing.

kedelai
sumber
3
pertanyaan berdasarkan jawaban Anda di sini: Saya memiliki kasus penggunaan yang harus saya miliki, katakanlah 30 contoh aplikasi node.js saya muncul dengan nomor port yang unik dan telah ditentukan sebelumnya (: 3000 hingga: 3030) dan masing-masing contoh menangani a kelompok pengguna tertentu yang hanya akan mengakses pada port yang ditetapkan. Jadi saya tidak ingin proses Master melakukan load balancing, tetapi hanya memulai (dan terus menjalankan) proses anak. Apakah ini mungkin? Atau akankah itu mencoba untuk menyebarkan beban ke semua proses anak yang melahirkan saja?
tamak
3
Saya akan menggunakan API programatik pm2 untuk meluncurkan 30 proses di fork_mode dan menggunakan sesuatu yang lain sebagai penyeimbang beban antara 30 port. Anda juga dapat menggunakan pm2 start -i 30 app.jsdan membiarkan cluster nodejs melakukan pekerjaannya.
soyuka
11
catatan: dalam cluster modeproses master adalah satu titik kegagalan.
Karl Pokus
42

Node.js adalah utas tunggal.

Itu berarti hanya 1 inti dari CPU quad-core Intel Anda yang dapat menjalankan aplikasi node.

Ini disebut: fork_mode.

Kami menggunakannya untuk pengembang lokal .

pm2 start server.js -i 0 membantu Anda menjalankan 1 utas node pada setiap inti CPU Anda.

Dan otomatis menyeimbangkan permintaan yang datang tanpa kewarganegaraan.

Di port yang sama .

Kami menyebutnya: cluster_mode.

Yang digunakan demi performa pada produksi .

Anda juga dapat memilih untuk melakukan ini pada pengembang lokal jika Anda ingin menguji PC Anda :)

haotang
sumber
2
terima kasih, itu menjelaskan banyak hal dalam pikiran saya tentang nodejs
Rishabh Agrawal
1
penjelasan yang bagus !!
Piqué
1
Node.js bukan utas tunggal, ada (saat ini) satu utas userland tetapi pasti didukung oleh utas libuv.
Benjamin Gruenbaum
1
@BenjaminGruenbaum Setuju dengan Anda. Pernyataan saya harus dipahami dengan asumsi bahwa saya tidak menyebutkan terlalu dalam sampai ke tingkat
libuv
16

Dokumentasi dan sumber sangat menyesatkan di sini.

Membaca ini di sumber, satu-satunya perbedaan tampaknya, bahwa mereka menggunakan node clusteratau child_processAPI. Sejak clustermenggunakan yang terakhir, Anda sebenarnya melakukan hal yang sama. Hanya ada lebih banyak kebiasaan yang stdioterjadi di sekitar penginapan fork_mode. Juga clusterhanya dapat dikomunikasikan dengan melalui string, bukan objek.

Secara default Anda menggunakan fork_mode. Jika Anda lulus -i [number]opsi-, Anda akan masuk cluster_mode, yang biasanya Anda tuju w / pm2.

Juga fork_modecontoh mungkin tidak dapat mendengarkan pada port yang sama karena EADDRINUSE. cluster_modebisa. Dengan cara ini Anda juga dapat menyusun aplikasi Anda agar berjalan pada port yang sama dengan beban seimbang secara otomatis. Anda harus membangun aplikasi tanpa status, misalnya sesi, dbs.

eljefedelrodeodeljefe
sumber
1
Saya masih bingung. clustermodul built-in menggunakan secara child_processinternal? dan saran Anda adalah jika saya membutuhkan fleksibel stdio, saya harus menggunakan mode Fork?
Jinyoung Kim
THe stdiohal adalah sesuatu dari pm2implementasi 's. Jangan khawatir tentang ini. Anda ingin menggunakan cluster_modedalam produksi karena ini memperkuat instance Anda karena menjalankan -i [number]instance di latar belakang. Gunakan fork_modejika pengerasan tidak diperlukan atau Anda ingin log dan barang yang lebih baik.
eljefedelrodeodeljefe
1
Juga jelas cluster_modemenggunakan lebih banyak sumber daya sistem Anda karena Anda menjalankan -i [number]proses.
eljefedelrodeodeljefe
Meskipun saya sangat menghargai jawaban Anda, saya tidak mengerti maksudnya bahkan sekarang. Sebagian besar penjelasan Anda bersifat alami (misalnya penggunaan CLI cluster_mode, keseimbangan beban cluster_mode, cluster_modemenggunakan lebih banyak sumber daya ..). Itulah alasan mengapa saya belum memilih. Bisakah Anda menjelaskan kedua kasus penggunaan sederhana? Setiap case harus memiliki alasan yang masuk akal mengapa mengambil modenya.
Jinyoung Kim
@eljefedelrodeodeljefe Dapatkah Anda menjelaskan lebih lanjut tentang "Anda harus membangun aplikasi tanpa status, misalnya sesi, dbs."? Mengapa aplikasi harus tanpa status?
STEN