Bagaimana sistem event Node.js berbeda dari pola aktor Akka?

93

Saya telah bekerja dengan Node.jssebentar dan menganggap diri saya cukup baik dengan Java. Tapi saya baru tahu Akkadan langsung tertarik dengan pola aktornya (dari apa yang saya pahami).

Sekarang, dengan asumsi keterampilan JavaScript saya setara dengan keterampilan Scala / Java saya, saya ingin fokus pada kepraktisan sistem mana pun. Apalagi dalam hal layanan web.

Menurut pemahaman saya, Node sangat baik dalam menangani banyak operasi bersamaan. Saya membayangkan layanan web Node yang baik untuk sistem manajemen aset akan unggul dalam menangani banyak pengguna yang mengirimkan perubahan pada saat yang sama (dalam aplikasi lalu lintas yang besar dan padat).

Tapi setelah membaca tentang aktor di Akka, jahitannya akan unggul di hal yang sama. Dan saya suka gagasan mengurangi pekerjaan menjadi potongan-potongan seukuran gigitan. Plus, bertahun-tahun yang lalu saya mencoba-coba Erlang dan jatuh cinta dengan sistem penyampaian pesan yang digunakannya.

Saya mengerjakan banyak aplikasi yang berhubungan dengan logika bisnis yang kompleks dan saya pikir inilah saatnya untuk melompat lebih berat ke satu atau yang lain. Terutama mengupgrade aplikasi Struts dan C # lama.

Bagaimanapun, untuk menghindari perang suci, bagaimana kedua sistem itu berbeda secara fundamental? Sepertinya keduanya diarahkan pada tujuan yang sama. Mungkin arsitektur "penyembuhan diri" Akka memiliki keuntungan.

EDIT

Sepertinya saya hampir mendapatkan suara. Tolong jangan anggap pertanyaan ini sebagai "mana yang lebih baik, simpul atau akka?". Apa yang saya cari adalah perbedaan mendasar dalam perpustakaan yang digerakkan oleh peristiwa seperti Node dan yang berbasis aktor seperti Akka.

cbmeeks.dll
sumber
12
saya memilih Anda untuk mengatakan "pergi" ke semua pemilih dekat :)
Nerrve
@cbmeeks bolehkah saya bertanya apa yang Anda pilih dan bagaimana hasilnya dengan pilihan Anda?
Jas

Jawaban:

64

Tanpa membahas detailnya (yang saya tahu terlalu sedikit dalam kasus Node.js), perbedaan utamanya adalah bahwa Node.js hanya mendukung konkurensi tanpa paralelisme sementara Akka mendukung keduanya. Kedua sistem sepenuhnya digerakkan oleh peristiwa dan dapat diskalakan ke beban kerja yang besar, tetapi kurangnya paralelisme membuatnya sulit di Node.js (yaitu paralelisme secara eksplisit dikodekan dengan memulai beberapa node dan mengirimkan permintaan yang sesuai; oleh karena itu tidak fleksibel pada waktu proses) , sementara itu cukup mudah di Akka karena pelaksana multi-utasnya yang merdu. Mengingat unit kerja kecil yang terisolasi (permintaan aktor) Akka secara otomatis akan memparalelkan eksekusi untuk Anda.

Perbedaan penting lainnya adalah bahwa Akka menyertakan sistem untuk menangani kegagalan secara terstruktur (dengan meminta setiap aktor diawasi oleh induknya, yang bersifat wajib) sedangkan Node.js bergantung pada konvensi bagi penulis untuk meneruskan kondisi kesalahan dari callback ke callback. Masalah yang mendasarinya adalah bahwa sistem asinkron tidak dapat menggunakan pendekatan standar pengecualian yang digunakan oleh sistem berbasis tumpukan sinkron, karena kode "panggilan" akan berpindah ke tugas yang berbeda pada saat kesalahan panggilan balik terjadi. Memiliki penanganan kesalahan yang dibangun ke dalam sistem membuatnya lebih mungkin bahwa aplikasi yang dibangun di atas sistem itu kuat.

Di atas tidak dimaksudkan untuk menjadi lengkap, saya yakin ada lebih banyak perbedaan.

Roland Kuhn
sumber
2
Apakah menurut Anda cara terbaik untuk menggunakan PLAY-FRAMEWORK atau SPRAY jika saya memutuskan untuk menggunakan AKKA untuk membangun aplikasi web yang tenang?
ses
4
Ya, keduanya adalah pilihan yang bagus. Play cocok sebagai kerangka kerja yang memberi Anda pengalaman pengembangan terintegrasi penuh, tetapi itu berarti Play akan menjalankan aplikasi Anda. Semprot lebih baik jika Anda hanya ingin memiliki lapisan REST tipis yang tertanam dalam aplikasi Akka Anda. Harap dicatat bahwa Spray akan menjadi akka-http di bulan-bulan mendatang.
Roland Kuhn
3
Dan juga untuk menunjukkan, Anda mendapatkan semua kebaikan dari bahasa yang diketik secara statis dengan Scala / Java dan tidak ada callback hell di javascript. Java / Scala akan lebih mudah untuk di-debug daripada javascript.
Chirdeep Tomar
2
Dalam hal paralelisme dengan simpul itu harus disebutkan bahwa Anda dapat garpu proses pada saat runtime dengan yang klaster API inti. Itu akan melakukan apa yang Anda maksud dengan aktor paralel.
kernel
2
Menurut saya jawaban dari tahun 2012 ini sekarang sangat kuno karena banyak hal telah berubah terutama dengan Node sejak mereka. Lihat npmjs.com/package/webworker-threads pekerja web di Node, Anda dapat memindahkan pemblokiran pekerjaan intesif ke proses parrellel (semua saat dalam proses Node yang sama).
Mark Pieszak - Trilon.io
8

Saya belum menggunakan Akka, tapi sepertinya itu erlang tapi di java. Dalam erlang semua proses seperti aktor di Akka, mereka memiliki kotak surat, Anda dapat mengirim pesan di antara mereka, Anda memiliki pengawas, dll.

Node.js menggunakan konkurensi kooperatif. Itu berarti Anda memiliki konkurensi saat Anda mengizinkannya (misalnya saat Anda memanggil operasi io atau beberapa peristiwa asinkron). Ketika Anda memiliki operasi panjang (menghitung sesuatu dalam putaran panjang) seluruh blok sistem.

Erlang menggunakan pengalihan tugas preemptive. Jika Anda memiliki loop yang panjang, sistem dapat menjedanya untuk menjalankan operasi lain dan melanjutkan setelah beberapa waktu. Untuk konkurensi besar-besaran, Node.js bagus jika Anda hanya melakukan operasi singkat. Keduanya mendukung jutaan klien: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 1-juta-begitu-2011 /

Di java Anda membutuhkan utas untuk melakukan konkurensi, jika tidak, Anda tidak dapat menjeda eksekusi di dalam fungsi yang dilakukan erlang (sebenarnya erlang berhenti di antara pemanggilan fungsi, tetapi ini terjadi dengan semua fungsi). Anda dapat menjeda eksekusi antar pesan.

yetihehe
sumber
Oke, jadi anggap saja saya perlu merekam file log dari berbagai sumber. Setiap kali aplikasi membuat entri log, saya juga perlu mengirim entri itu ke aplikasi lain untuk direkam. Saya berasumsi ini bisa menjadi proses yang berjalan lama karena aplikasi dapat memiliki waktu tunggu DB, kegagalan http, dll. Jadi dalam contoh ini, hang secara tertulis ke DB akan menyebabkan seluruh sistem Node saya hang? Apakah AKKA akan mengalami masalah yang sama atau saya hanya tidak mendapatkan korelasinya?
cbmeeks
1
Keduanya tidak akan menderita, karena akses db biasanya diimplementasikan sebagai asynchronous dalam kasus seperti itu. Tetapi jika Anda entah bagaimana berhasil membuat pustaka sinkron melakukan itu, keduanya akan membeku.
yetihehe
Terima kasih. Saya berusaha sangat keras untuk tidak mengubah ini menjadi node vs akkadebat, tetapi saya memiliki masalah nyata yang harus saya selesaikan. Saya akan mengatakan keterampilan Java / JavaScript saya cukup dekat tetapi saya memiliki sedikit pengalaman dengan Node dan tidak ada dengan AKKA (atau Scala). Tetapi saya memiliki beberapa aplikasi (internal untuk saat ini tetapi untuk eksternal nanti) dan orang-orang mencari cara untuk mencari log yang sangat besar ini. Tidak dapat menggunakan opsi pihak ketiga eksternal karena masalah privasi. Sepertinya itu akan menangani pekerjaan itu. Tapi saya suka pesan yang lewat dari AKKA jadi saya bisa mengeksplorasinya. Ditambah Java didorong lebih banyak di sini daripada JS. Terima kasih.
cbmeeks
Jika Anda perlu mencari log besar-besaran, coba lihat logstash atau graylog2.
Toddius Zho
6

Saya tidak yakin ini perbandingan yang adil untuk menggambar. Saya membaca ini lebih sebagai "bagaimana sistem berbasis peristiwa dibandingkan dengan model aktor?". Nodejs dapat mendukung model aktor seperti yang dilakukan Scala di Akka, atau C # di Orleans, sebenarnya lihat nactor , seseorang tampaknya sudah mencobanya.

Mengenai bagaimana perbandingan antara sistem peristiwa vs. model aktor, saya akan membiarkan orang-orang yang lebih bijak menjelaskannya. Beberapa poin singkat tentang model Aktor:

  • Model aktor berbasis pesan
  • Model aktor cenderung berhasil dengan baik dengan sistem terdistribusi (cluster). Sistem berbasis peristiwa tertentu dapat didistribusikan, tetapi saya pikir model aktor memiliki distribusi bawaan sehubungan dengan pendistribusian komputasi. Permintaan baru dapat diarahkan ke aktor baru di silo yang berbeda, tidak yakin bagaimana ini akan bekerja dalam acara berbasis.
  • Model Aktor mendukung kegagalan dalam hal itu, jika apperas cluster 1 menjadi tidak aktif, pengamat umumnya dapat menemukan silo yang berbeda untuk melakukan pekerjaan

Juga, lihat drama . Ini adalah implementasi model aktor nodejs lain.

stevebot
sumber
1
coba atur cluster dengan nodejs, Anda memerlukan buruh pelabuhan, kubernetees dan membuat sistem terdistribusi. Coba juga untuk mengatur penggunaan 1 inti lagi di nodejs. Akka memang ingin berurusan dengan itu. juga kematangan nodejs itu sendiri, keamanan, dan cara untuk membuat kode yang membutuhkan kerangka kerja lain untuk melakukan sesuatu, adalah titik dimana nodejs itu sendiri tidak dapat digunakan untuk sistem terdistribusi besar, tetapi hanya dalam mode MSA. Pendapat saya sih.
Raffaello