Pertanyaan Bagaimana implementasi beberapa Aktor di Scala berbeda?


Dengan peluncuran Scala 2.9.0, Typeafe Stack juga diumumkan, yang menggabungkan bahasa Scala dengan kerangka Akka. Sekarang, meskipun Scala memiliki aktor di perpustakaan standarnya, Akka menggunakan implementasinya sendiri. Dan, jika kami mencari penerapan lain, kami juga akan menemukan bahwa Angkat dan Scalaz memiliki penerapan juga!

Jadi, apa perbedaan antara implementasi ini?


76
2018-05-13 19:47


asal


Jawaban:


Jawaban ini bukan milik saya. Itu diproduksi oleh Viktor Klang (dari ketenaran Akka) dengan bantuan David Pollak (dari Angkat ketenaran), Jason Zaugg (ketenaran Scalaz), Philipp Haller (dari ketenaran Scala Actors).

Yang saya lakukan di sini adalah memformatnya (yang akan lebih mudah jika tabel yang didukung Stack Overflow).

Ada beberapa tempat yang akan saya isi nanti ketika saya punya lebih banyak waktu.

Filosofi desain

  • Aktor Scalaz

    Kerumitan yang minimal. Generalitas maksimal, modularitas dan diperpanjang.

  • Angkat Aktor

    Kerumitan Minimal, Pengumpulan Sampah oleh JVM daripada mengkhawatirkan siklus hidup eksplisit, perilaku penanganan kesalahan yang konsisten dengan program Scala & Java lainnya, jejak memori ringan / kecil, kotak surat, mirip dengan Aktor Scala dan aktor Erlang, kinerja tinggi.

  • Aktor Scala

    Berikan model aktor Erlang lengkap di Scala, jejak memori ringan / kecil.

  • Akka Aktor

    Sederhana dan transparan didistribusikan, kinerja tinggi, ringan dan sangat mudah beradaptasi.

Versi

                    Aktor Scalaz, Aktor Angkat Aktor Aktor Aktor
Ver stabil saat ini. 5 2.1 2.9.0 0.10
Minimum Scala ver. 2.8 2.7.7 2.8
Minimum Java ver. 1.5 1.5 1.6

Dukungan Model Aktor

                    Aktor Scalaz, Aktor Angkat Aktor Aktor Aktor
Spawn aktor baru Ya Ya Ya Ya
di dalam aktor
Kirim pesan ke Ya Ya Ya Ya
aktor yang dikenal
Ubah perilaku Aktor Ya Ya: bersarang Ya:
untuk pesan berikutnya yang berubah / diterima menjadi / tidakbaik
Pengawasan Tidak disediakan Tanpa Aktor: Ya, Ya
(link / trapExit) Reaktor: Tidak

Tingkat isolasi negara

Jika pengguna mendefinisikan metode publik Aktor mereka, mereka bisa dipanggil luar?

  • Aktor Scalaz: n / a. Aktor adalah sifat tersegel.
  • Angkat Aktor: Ya
  • Aktor Scala: Ya
  • Akka Aktor: Tidak, aktor contoh terlindung di belakang ActorRef.

Tipe aktor

  • Aktor Scalaz: Actor[A] extends A => ()
  • Angkat Aktor: LiftActor, SpecializeLiftActor[T]
  • Aktor Scala: Reactor[T], Actor extends Reactor[Any]
  • Akka Aktor: Actor[Any]

Manajemen siklus hidup aktor

                    Aktor Scalaz, Aktor Angkat Aktor Aktor Aktor
Manual mulai Tidak Tidak Ya Ya
Manual berhenti Tidak Tidak Tidak Ya
Restart-on-failure n / a Ya Ya Dapat dikonfigurasi per aktor instance
Restart semantik n / a Jalankan kembali aktor Mengembalikan aktor ke kondisi stabil dengan mengalokasikan kembali dan
                                                    perilaku membuang contoh lama
Restart konfigurabilitas n / a n / a X kali, X kali dalam waktu Y
Pengait siklus hidup disediakan Tidak ada tindakan siklus hidup preStart, postStop, preRestart, postRestart

Mode pengiriman pesan

                    Aktor Scalaz, Aktor Angkat Aktor Aktor Aktor
Api-lupakan! aktor pesan! msg actor! msg actorRef! msg
                    sebuah pesan)
Kirim-terima-balasan (lihat 1) aktor!? msg aktor !? msg actorRef !! msg
                                    aktor !! msg
Aktor kirim-terima-depan (lihat 2) !! msg actorRef !!! msg
Kirim-hasil-janji (pesan). future.onComplete (f => to! f.result)
masa depan (aktor)
Gambarkan aktor dengan aktor comap f No No No
fungsi (lihat 3)

(1) Setiap fungsi f menjadi aktor seperti itu:

val a: Msg => Promise[Rep] = f.promise
val reply: Rep = a(msg).get

(2) Setiap fungsi f menjadi aktor seperti itu:

val a = f.promise
val replyFuture = a(message)

(3) Fungsi kontravarian: actor comap f. Juga komposisi Kleisli di Promise.

Mode balasan pesan

TBD

                    Aktor Scalaz, Aktor Angkat Aktor Aktor Aktor
balasan-ke-pengirim-dalam-pesan
balasan-ke-pesan

Pemrosesan pesan

Mendukung penerimaan bersarang?

  • Aktor Scalaz: -
  • Angkat Aktor: Ya (dengan sedikit tulisan tangan).
  • Aktor Scala: Ya, respons berbasis-umpan dan berbasis kejadian bereaksi.
  • Akka Aktor: Tidak, peneluran yang diterima dapat menyebabkan kebocoran memori dan kinerja yang menurun dari waktu ke waktu.

Mekanisme Pelaksanaan Pesan

TBD

                    Aktor Scalaz, Aktor Angkat Aktor Aktor Aktor
Nama untuk Mekanisme Eksekusi
Mekanisme Eksekusi adalah
dapat dikonfigurasi
Mekanisme Eksekusi bisa
ditentukan berdasarkan per-aktor
Siklus Hidup Mekanisme Eksekusi
harus dikelola secara eksplisit
Eksekusi Thread-per-aktor
mekanisme
Mekanisme eksekusi event-driven
Jenis kotak surat
Mendukung kotak surat sementara
Mendukung kotak surat persisten

Distribusi / Aktor Jarak Jauh

                    Aktor Scalaz, Aktor Angkat Aktor Aktor Aktor
Jarak jauh transparan n / a Tidak Ya Ya
aktor
Protokol transport n / a n / a Java Akka Remote Protocol
                                                    serialisasi (Protobuf di atas TCP)
                                                    di atas TCP
Pengelompokan dinamis n / a n / a n / a Dalam penawaran komersial

Howtos

TBD

                    Aktor Scalaz, Aktor Angkat Aktor Aktor Aktor
Definisikan seorang aktor
Buat instance aktor
Mulai instance aktor
Hentikan instance aktor

95
2018-05-13 20:53



  • scala.actors adalah upaya serius pertama untuk menerapkan konkurensi gaya Erlang di Scala yang telah mengilhami desainer perpustakaan lain untuk membuat yang lebih baik (dalam beberapa kasus) dan implementasi yang lebih berkinerja. Masalah terbesar (setidaknya untuk saya), adalah bahwa tidak seperti proses Erlang, dilengkapi dengan OTP (yang memungkinkan untuk membangun sistem toleransi kesalahan), scala.actors hanya menawarkan fondasi yang baik, satu set primitif stabil yang harus digunakan untuk membangun kerangka kerja yang lebih tinggi - pada akhir hari, Anda harus menulis supervisor Anda sendiri, katalog aktor, mesin negara yang terbatas, dll di atas para aktor.

  • Dan di sini Akka datang untuk menyelamatkan, menawarkan setumpuk fitur lengkap untuk pengembangan berbasis aktor: aktor idiomatik lebih, set abstraksi tingkat tinggi untuk koordinasi (load balancers, aktor renang, dll) dan membangun sistem toleransi kesalahan (supervisor, porting dari OTP, dll.), penjadwal mudah dikonfigurasi (dispatcher), dan seterusnya. Maaf, jika saya terdengar kasar, tapi saya pikir, tidak akan ada penggabungan 2.9.0+ - Saya lebih berharap Akka aktor untuk secara bertahap menggantikan implementasi stdlib.

  • Scalaz. Biasanya saya memiliki pustaka ini dalam daftar dependensi semua proyek saya, dan ketika, untuk beberapa alasan, saya tidak dapat menggunakannya Akka, tidak memblokir Janji Scalaz (dengan semua kebaikan, seperti sequence) Dikombinasikan dengan aktor standar yang menyelamatkan hari. Saya tidak pernah digunakan Scalaz aktor sebagai pengganti scala.actors atau Akka, bagaimanapun.


23
2018-05-13 21:13



Aktor: Scala 2.10 vs Akka 2.3 vs Angkat 2.6 vs Scalaz 7.1

Kode tes & hasil untuk rata-rata latensi dan keluaran pada JVM 1.8.0_x.


2
2018-04-02 10:24