Saya telah mendengar banyak mengoceh tentang kerangka kerja Akka (platform layanan Java / Scala), tetapi sejauh ini belum melihat banyak contoh aktual dari kasus penggunaan itu akan baik untuk. Jadi saya akan tertarik untuk mendengar tentang hal-hal yang berhasil digunakan pengembang.
Hanya satu batasan: tolong jangan sertakan kasus penulisan server obrolan. (mengapa? karena ini telah digunakan secara berlebihan sebagai contoh untuk banyak hal serupa)
Jawaban:
Saya telah menggunakannya sejauh ini dalam dua proyek nyata dengan sangat sukses. keduanya berada dalam bidang informasi lalu lintas real-time (lalu lintas seperti dalam mobil di jalan raya), didistribusikan melalui beberapa node, mengintegrasikan pesan antara beberapa pihak, sistem backend yang dapat diandalkan. Saya belum bebas untuk memberikan spesifik tentang klien, ketika saya mendapatkan OK mungkin dapat ditambahkan sebagai referensi.
Akka benar-benar berhasil dalam proyek-proyek itu, meskipun kami mulai ketika itu pada versi 0.7. (Omong-omong, kami menggunakan scala)
Salah satu keuntungan besar adalah kemudahan di mana Anda dapat menyusun sistem dari aktor dan pesan dengan hampir tidak ada boilerplating, itu menskala dengan sangat baik tanpa semua kompleksitas threading linting tangan dan Anda mendapatkan pesan asinkron melewati antara objek hampir gratis.
Ini sangat baik dalam memodelkan semua jenis penanganan pesan asinkron. Saya lebih suka menulis semua jenis sistem layanan (web) dengan gaya ini daripada gaya lainnya. (Apakah Anda pernah mencoba untuk menulis layanan web asinkron (sisi server) dengan JAX-WS? Itu banyak pipa ledeng). Jadi saya akan mengatakan sistem apa pun yang tidak ingin menggantung pada salah satu komponennya karena semuanya secara implisit disebut menggunakan metode sinkron, dan bahwa satu komponen mengunci sesuatu. Ini sangat stabil dan solusi kegagalan + pengawas let-it-crash + benar-benar berfungsi dengan baik. Semuanya mudah diatur secara program dan tidak sulit untuk unit test.
Lalu ada modul tambahan yang luar biasa. Modul Camel benar-benar terhubung dengan baik ke Akka dan memungkinkan pengembangan layanan asinkron yang mudah dengan titik akhir yang dapat dikonfigurasi.
Saya sangat senang dengan frameworknya dan ini menjadi standar de facto untuk sistem terhubung yang kami bangun.
sumber
Penafian: Saya PO untuk Akka
Selain menawarkan smorgasbord konkurensi yang jauh lebih mudah untuk dipikirkan dan diperbaiki (aktor, agen, konkurensi dataflow) dan dengan kontrol konkurensi dalam bentuk STM.
Berikut beberapa kasus penggunaan yang dapat Anda pertimbangkan:
sumber
Contoh cara kami menggunakannya adalah pada antrian prioritas transaksi kartu debit / kredit. Kami memiliki jutaan ini dan upaya pekerjaan tergantung pada tipe string input. Jika transaksi bertipe CHECK, kami memiliki sedikit pemrosesan tetapi jika ini merupakan titik penjualan maka ada banyak yang harus dilakukan seperti menggabungkan dengan data meta (kategori, label, tag, dll) dan menyediakan layanan (peringatan email / sms, deteksi penipuan, saldo dana rendah, dll). Berdasarkan tipe input, kami membuat kelas dari berbagai sifat (disebut mixin) yang diperlukan untuk menangani pekerjaan dan kemudian melakukan pekerjaan. Semua pekerjaan ini masuk ke antrian yang sama dalam mode realtime dari berbagai lembaga keuangan. Setelah data dibersihkan, data dikirim ke penyimpanan data yang berbeda untuk kegigihan, analitik, atau didorong ke koneksi soket, atau untuk Mengangkat aktor komet. Aktor yang bekerja terus-menerus menyeimbangkan pekerjaan sehingga kita dapat memproses data secepat mungkin. Kami juga dapat memanfaatkan layanan tambahan, model ketekunan, danstm untuk poin keputusan kritis.
Pesan gaya Erlang OTP lewat JVM membuat sistem yang bagus untuk mengembangkan sistem waktu nyata di pundak perpustakaan dan server aplikasi yang ada.
Akka memungkinkan Anda untuk melakukan message passing seperti pada tradisional esbtapi dengan kecepatan! Ini juga memberi Anda alat dalam kerangka kerja untuk mengelola sejumlah besar aktor kolam, node jarak jauh, dan toleransi kesalahan yang Anda butuhkan untuk solusi Anda.
sumber
Kami menggunakan Akka untuk memproses panggilan REST secara tidak sinkron - bersama dengan server web async (berbasis Netty) kami dapat mencapai peningkatan 10 kali lipat pada jumlah pengguna yang dilayani per node / server, dibandingkan dengan thread tradisional per model permintaan pengguna.
Katakan kepada bos Anda bahwa tagihan hosting AWS Anda akan turun dengan faktor 10 dan itu adalah no-brainer! Shh ... jangan katakan itu ke Amazon ... :)
sumber
Kami menggunakan Akka dalam proyek Telco skala besar (sayangnya saya tidak bisa mengungkapkan banyak detail). Akka aktor digunakan dan diakses dari jarak jauh oleh aplikasi web. Dengan cara ini, kami memiliki model RPC yang disederhanakan berdasarkan pada protobuffer Google dan kami mencapai paralelisme menggunakan Akka Futures. Sejauh ini, model ini telah bekerja dengan sangat baik. Satu catatan: kami menggunakan Java API.
sumber
Jika Anda mengabstraksi server obrolan naik tingkat, maka Anda mendapatkan jawabannya.
Akka menyediakan sistem pengiriman pesan yang mirip dengan mentalitas Erlang "let it crash".
Jadi contohnya adalah hal-hal yang membutuhkan berbagai tingkat daya tahan dan keandalan pesan:
Hal-hal baik tentang Akka adalah pilihannya untuk kegigihan, implementasi STM, server REST dan toleransi kesalahan.
Jangan jengkel dengan contoh server obrolan, anggap itu sebagai contoh kelas solusi tertentu.
Dengan semua dokumentasi mereka yang sangat bagus, saya merasa ada celah dalam pertanyaan, kasus penggunaan dan contoh yang tepat ini. Ingatlah bahwa contoh-contohnya tidak sepele.
(Ditulis dengan hanya pengalaman menonton video dan bermain dengan sumbernya, saya tidak menerapkan apa pun menggunakan akka.)
sumber
Kami menggunakan Akka di beberapa proyek di tempat kerja, yang paling menarik terkait dengan perbaikan kecelakaan kendaraan. Terutama di Inggris tetapi sekarang berkembang ke AS, Asia, Australasia, dan Eropa. Kami menggunakan aktor untuk memastikan bahwa informasi perbaikan kecelakaan diberikan secara real-time untuk memungkinkan perbaikan kendaraan yang aman dan efektif biaya.
Pertanyaan dengan Akka sebenarnya lebih 'apa yang tidak bisa kamu lakukan dengan Akka'. Kemampuannya untuk berintegrasi dengan kerangka kerja yang kuat, abstraksi yang kuat, dan semua aspek toleransi kesalahan menjadikannya alat yang sangat komprehensif.
sumber
Anda dapat menggunakan Akka untuk beberapa hal.
Saya sedang mengerjakan sebuah situs web, tempat saya memigrasikan tumpukan teknologi ke Scala dan Akka. Kami menggunakannya untuk hampir semua yang terjadi di situs web. Meskipun Anda mungkin berpikir bahwa contoh Obrolan itu buruk, semua pada dasarnya sama:
Terutama pembaruan langsung mudah karena mereka turun ke apa yang contoh Chat dulu. Bagian layanan adalah topik menarik lainnya karena Anda dapat memilih untuk menggunakan aktor jarak jauh dan bahkan jika aplikasi Anda tidak dikelompokkan, Anda dapat menyebarkannya ke mesin yang berbeda dengan mudah.
Saya juga menggunakan Akka untuk aplikasi autorouter PCB dengan gagasan untuk dapat skala dari laptop ke pusat data. Semakin banyak kekuatan yang Anda berikan, semakin baik hasilnya. Ini sangat sulit diterapkan jika Anda mencoba menggunakan konkurensi biasa karena Akka juga memberi Anda transparansi lokasi.
Saat ini sebagai proyek waktu luang, saya sedang membangun kerangka web hanya menggunakan aktor. Sekali lagi manfaatnya adalah skalabilitas dari satu mesin ke seluruh sekelompok mesin. Selain itu, menggunakan pendekatan berbasis pesan membuat layanan perangkat lunak Anda berorientasi sejak awal. Anda memiliki semua komponen yang bagus itu, berbicara satu sama lain tetapi tidak harus saling mengenal, hidup di mesin yang sama, bahkan di pusat data yang sama.
Dan karena Google Reader ditutup, saya mulai dengan pembaca RSS, menggunakan Akka tentu saja. Ini semua tentang layanan enkapsulasi bagi saya. Sebagai kesimpulan: Model aktor itu sendiri adalah apa yang harus Anda adopsi terlebih dahulu dan Akka adalah kerangka kerja yang sangat andal yang membantu Anda menerapkannya dengan banyak manfaat yang akan Anda terima di sepanjang jalan.
sumber
Kami menggunakan akka dengan plugin untanya untuk mendistribusikan analisis dan pemrosesan tren kami untuk twimpact.com . Kami harus memproses antara 50 dan 1000 pesan per detik. Selain pemrosesan multi-simpul dengan unta, ia juga digunakan untuk mendistribusikan pekerjaan pada prosesor tunggal ke beberapa pekerja untuk kinerja maksimum. Bekerja cukup baik, tetapi membutuhkan pemahaman tentang bagaimana menangani kemacetan.
sumber
Saya mencoba tangan saya pada Akka (Java api). Apa yang saya coba adalah membandingkan model konkurensi berbasis aktor Akka dengan model konkurensi Java biasa (kelas java.util.concurrent).
Kasus penggunaan adalah peta kanonik sederhana mengurangi implementasi jumlah karakter. Dataset adalah kumpulan string yang dihasilkan secara acak (panjang 400 karakter), dan menghitung jumlah vokal di dalamnya.
Untuk Akka saya menggunakan BalancedDispatcher (untuk load balancing di antara utas) dan RoundRobinRouter (untuk menjaga batas pada aktor fungsi saya). Untuk Java, saya menggunakan teknik fork join sederhana (diimplementasikan tanpa algoritma mencuri pekerjaan) yang akan memetakan / mengurangi eksekusi dan menggabungkan hasilnya. Hasil antara diadakan dalam memblokir antrian untuk membuat sambungan sejajar mungkin. Mungkin, jika saya tidak salah, itu akan meniru konsep "kotak surat" aktor Akka, di mana mereka menerima pesan.
Pengamatan: Hingga beban menengah (~ input string 50000) hasilnya sebanding, sedikit berbeda dalam iterasi yang berbeda. Namun, ketika saya menambah beban saya ke ~ 100000, itu akan menggantung solusi Java. Saya mengkonfigurasi solusi Java dengan 20-30 utas di bawah kondisi ini dan gagal di semua iterasi.
Meningkatkan muatan menjadi 10.000, juga berakibat fatal bagi Akka. Saya dapat berbagi kode dengan siapa pun yang tertarik untuk melakukan pemeriksaan silang.
Jadi bagi saya, tampaknya Akka lebih baik daripada solusi multithreaded Java tradisional. Dan mungkin alasannya adalah sihir Scala di bawah tenda.
Jika saya bisa memodelkan domain masalah sebagai pesan yang didorong oleh peristiwa lewat satu, saya pikir Akka adalah pilihan yang baik untuk JVM.
Tes dilakukan pada: Versi Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bit. Ram 3GB. Prosesor Intel Core i5, kecepatan clock 2,5 GHz
Harap dicatat, domain masalah yang digunakan untuk pengujian dapat diperdebatkan dan saya mencoba untuk bersikap adil sejauh pengetahuan Java saya diizinkan :-)
sumber
Kami menggunakan Akka dalam sistem dialog yang diucapkan ( primetalk ). Baik secara internal maupun eksternal. Untuk secara bersamaan menjalankan banyak saluran telepon pada satu node cluster, jelas perlu memiliki beberapa kerangka kerja multithreading. Akka bekerja dengan sempurna. Kami memiliki mimpi buruk sebelumnya dengan java-concurrency. Dan dengan Akka itu seperti ayunan - itu hanya bekerja. Kuat dan dapat diandalkan. 24 * 7, tanpa henti.
Di dalam saluran kami memiliki aliran peristiwa waktu-nyata yang diproses secara paralel. Khususnya: - pengenalan ucapan otomatis yang panjang - dilakukan dengan aktor; - produsen output audio yang mencampur beberapa sumber audio (termasuk ucapan yang disintesis); - Konversi teks-ke-suara adalah seperangkat aktor terpisah yang dibagi di antara saluran; - pemrosesan semantik dan pengetahuan.
Untuk membuat interkoneksi dari pemrosesan sinyal yang kompleks, kami menggunakan SynapseGrid . Ini memiliki keuntungan dari pemeriksaan waktu kompilasi DataFlow dalam sistem aktor yang kompleks.
sumber
Saya baru-baru ini menerapkan contoh pengurangan peta kanonik di Akka: Jumlah kata. Jadi ini adalah salah satu kasus penggunaan Akka: kinerja yang lebih baik Itu lebih merupakan eksperimen aktor JRuby dan Akka daripada yang lain, tetapi juga menunjukkan bahwa Akka bukan Scala atau Java saja: ini bekerja pada semua bahasa di atas JVM.
sumber