Node.js olaylı sistemin Akka'nın aktör modelinden farkı nedir?


94

Bir süre ile çalıştım Node.jsve kendimi Java konusunda oldukça iyi görüyorum . Ama Akkaaktör modelini yeni keşfettim ve hemen ilgilendim (anladığım kadarıyla).

Şimdi, JavaScript becerilerimin Scala / Java becerilerimle aynı olduğunu varsayarak, her iki sistemin pratikliğine odaklanmak istiyorum. Özellikle web hizmetleri açısından.

Anladığım kadarıyla Node, birçok eşzamanlı işlemi gerçekleştirmede mükemmel. Bir varlık yönetim sistemi için iyi bir Node web hizmetinin, aynı anda (büyük, yoğun trafik uygulamasında) değişiklikleri gönderen birçok kullanıcıyı idare etmede mükemmel olacağını hayal ediyorum.

Ancak Akka'daki aktörleri okuduktan sonra, aynı şeyde mükemmel olacağını gösteriyor. Ve işi küçük parçalara indirme fikrini seviyorum. Artı, yıllar önce Erlang'la uğraştım ve kullandığı mesaj aktarma sistemine aşık oldum.

Karmaşık iş mantığıyla ilgilenen birçok uygulama üzerinde çalışıyorum ve bunlardan birine veya diğerine daha fazla atlamanın zamanının geldiğini düşünüyorum. Özellikle eski Struts ve C # uygulamalarını yükseltmek.

Her neyse, kutsal savaşlardan kaçınarak, iki sistem temelde nasıl farklı? Görünüşe göre ikisi de aynı hedefe yönelik. Belki de Akka'nın "kendini iyileştiren" mimarisi bir avantaja sahip.

DÜZENLE

Görünüşe göre yakın oylar alıyorum. Lütfen bu soruyu "hangisi daha iyi, düğüm mü yoksa akka mı?" Olarak almayın. Aradığım şey, Node gibi olaya dayalı kitaplıklar ve Akka gibi aktör tabanlı kitaplıklardaki temel farklılıklar.


12
Tüm bu yakın seçmenlere "
defol

@cbmeeks neyi seçtiğinizi ve seçiminizle sizin için nasıl gittiğini sorabilir miyim?
Jas

Yanıtlar:


66

Ayrıntılara girmeden (Node.js konusunda çok az bildiğim) temel fark, Node.js'nin paralellik olmadan yalnızca eşzamanlılığı desteklerken Akka her ikisini de desteklemesidir. Her iki sistem de tamamen olay güdümlüdür ve büyük iş yüklerine ölçeklenebilir, ancak paralellik eksikliği Node.js'de işi zorlaştırır (yani paralellik, birden çok düğüm başlatılarak ve buna göre istek gönderilerek açıkça kodlanır; bu nedenle çalışma zamanında esnek değildir) Akka'da ayarlanabilir çok kanallı uygulayıcıları sayesinde oldukça kolay. Küçük izole çalışma birimleri (aktör çağrısı) verildiğinde Akka, yürütmeyi sizin için otomatik olarak paralel hale getirecektir.

Diğer bir önemli fark, Akka'nın başarısızlığı yapısal bir şekilde ele almak için bir sistem içermesidir (her bir aktörün ebeveyni tarafından denetlenmesi zorunludur); oysa Node.js, yazarların hata koşullarını geri aramadan geri aramaya geçirmeleri için kurallara dayanır. Altta yatan sorun, zaman uyumsuz sistemlerin, eşzamanlı yığın tabanlı sistemler tarafından kullanılan standart istisnalar yaklaşımını kullanamamasıdır, çünkü "çağıran" kod, geri arama hatası oluştuğunda farklı görevlere taşınmış olacaktır. Sistemde yerleşik hata işlemeye sahip olmak, o sistem üzerine kurulu uygulamaların sağlam olma olasılığını artırır.

Yukarıdakilerin kapsamlı olması amaçlanmamıştır, eminim çok daha fazla farklılık vardır.


2
Dinlendirici web uygulaması oluşturmak için AKKA'yı kullanmaya karar verirsem PLAY-FRAMEWORK veya SPRAY kullanmanın en iyi yolu olduğunu düşünüyor musunuz?
SES

4
Evet, ikisi de iyi seçimler. Play, size tamamen entegre bir geliştirme deneyimi sunan bir çerçeve olarak uygundur, ancak bu, Play'in uygulamanızı çalıştıracağı anlamına gelir. Akka uygulamanıza ince bir REST katmanının gömülü olmasını istiyorsanız sprey daha iyidir. Spray'in önümüzdeki aylarda akka-http olacağını lütfen unutmayın.
Roland Kuhn

3
Ve ayrıca belirtmek gerekirse, Scala / Java ile statik olarak yazılmış bir dilin tüm iyiliğini elde edersiniz ve javascript'te geri arama cehennemi yoktur. Java / Scala, javascript'ten daha kolay hata ayıklayacaktır.
Chirdeep Tomar

2
Düğümle paralellik açısından, küme çekirdek API'si ile çalışma zamanında süreçleri çatallayabileceğinizden bahsetmek gerekir . Paralel oyuncularla ne demek istiyorsan onu yapacak.
çekirdek

2
Bana öyle geliyor ki 2012'den gelen bu cevap artık çok eski çünkü onlardan beri özellikle Node ile birçok şey değişti. Düğümde npmjs.com/package/webworker-threads web çalışanlarına bakın, engelleyici yoğun çalışmayı bir paralel işleme taşıyabilirsiniz (hepsi aynı Düğüm sürecindeyken).
Mark Pieszak - Trilon.io

8

Henüz Akka'yı kullanmadım, ama görünüşe göre erlang'a benziyor ama java'da. Erlang'da tüm süreçler Akka'daki aktörler gibidir, posta kutuları vardır, aralarında mesaj gönderebilirsiniz, amirleriniz vardır vb.

Node.js, işbirliğine dayalı eşzamanlılığı kullanır. Bu, izin verdiğinizde eşzamanlılığa sahip olduğunuz anlamına gelir (örneğin, io işlemini veya bazı asenkron olayları çağırdığınızda). Uzun bir işlem yaptığınızda (uzun döngüdeki bir şeyi hesaplarken) tüm sistem blokları.

Erlang, önleyici görev geçişini kullanır. Uzun döngünüz olduğunda, sistem başka bir işlemi çalıştırmak için onu duraklatabilir ve bir süre sonra devam edebilir. Büyük eşzamanlılık için Node.js, yalnızca kısa işlemler yapıyorsanız iyidir. Her ikisi de milyonlarca müşteriyi destekliyor: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 1 milyon öyle-2011 /

Java'da herhangi bir eşzamanlılık yapmak için iş parçacığına ihtiyacınız var, aksi takdirde erlang'ın yaptığı işlev içinde yürütmeyi duraklatamazsınız (aslında erlang işlev çağrıları arasında duraklar, ancak bu tüm işlevlerle birlikte gerçekleşir). Mesajlar arasında yürütmeyi duraklatabilirsiniz.


Tamam, birçok farklı kaynaktan günlük dosyalarını kaydetmem gerektiğini varsayarsak. Bir uygulama her günlük girişi oluşturduğunda, bu girişi kayıt için başka bir uygulamaya da göndermem gerekiyor. Bunun uzun süren bir süreç olabileceğini varsayıyorum çünkü uygulamada DB zaman aşımları, http hataları vb. Olabilir. Yani bu örnekte, DB'ye yazılan bir takılma tüm Node sistemimin askıda kalmasına neden olur mu? AKKA da aynı sorunu yaşar mıydı yoksa korelasyonu anlamıyor muyum?
cbmeeks

1
Bu tür durumlarda db erişimi tipik olarak eşzamansız olarak uygulandığından, ikisi de zarar görmez. Ama bunu yaparken bir şekilde senkronize kitaplık yapmayı başardıysanız, ikisi de donacaktır.
yetihehe

Teşekkürler. Bunu node vs akkatartışmaya çevirmemek için çok uğraşıyorum ama çözmem gereken gerçek bir problemim var. Java / JavaScript becerilerimin oldukça yakın olduğunu söyleyebilirim ancak Node ile çok az deneyimim var ve AKKA (veya Scala) ile hiç deneyimim yok. Ancak birkaç uygulamam var (şimdilik dahili, daha sonra harici) ve insanlar bu büyük günlükleri araştırmanın yollarını arıyor. Gizlilik sorunları nedeniyle harici 3. taraf seçenekleri kullanılamaz. Görünüşe göre işi halledecek. Ama AKKA'nın mesaj göndermesini seviyorum, bu yüzden onu keşfedebilirim. Artı Java burada JS'den daha fazla itiliyor. Teşekkürler.
cbmeeks

Çok büyük günlükleri aramanız gerekiyorsa, logstash veya graylog2'ye bakmayı deneyin.
Toddius Zho

6

Bunun adil bir kıyaslama olduğundan emin değilim. Bunu daha çok "olay tabanlı bir sistem bir aktör modeliyle karşılaştırıldığında nasıldır?" Şeklinde okudum. Nodejs, Scala'nın Akka'da yaptığı gibi veya Orleans'ta C # gibi bir aktör modelini destekleyebilir, aslında nactor'a bakın , birileri zaten deniyor gibi görünüyor.

Olaylı bir sistem ile aktör modelinin nasıl karşılaştırılacağına gelince, daha akıllı insanların onu tanımlamasına izin verirdim. Actor modeli hakkında birkaç kısa nokta:

  • Oyuncu modeli mesaj tabanlıdır
  • Aktör modelleri, dağıtılmış sistemlerle (kümeler) iyi sonuç verme eğilimindedir. Elbette olay tabanlı sistemler dağıtılabilir, ancak aktör modelinin hesaplamaları dağıtma konusunda yerleşik bir dağıtıma sahip olduğunu düşünüyorum. Yeni bir istek, farklı bir silodaki yeni bir aktöre yönlendirilebilir, bunun olaya göre nasıl çalışacağından emin olamaz.
  • Actor modeli başarısızlığı destekler, eğer küme 1 uygulaması çalışmazsa, gözlemci işi yapmak için genellikle farklı bir silo bulabilir.

Ayrıca dramaya bakın . Başka bir nodejs aktör modeli uygulamasıdır.


1
nodejs ile bir küme kurmayı deneyin, docker, kubernete'lere ihtiyacınız var ve dağıtılmış sistemi oluşturun. Ayrıca nodejs'de 1 çekirdek daha kullanımını ayarlamayı deneyin. Akka, bunlarla başa çıkmak için tasarlandı. ayrıca nodejs'nin olgunluğu, güvenliği ve bir şey yapmak için başka bir çerçeve gerektiren kodlama yolu, düğümlerin kendisinin büyük dağıtılmış sistem için kullanılamayacağı, en azından MSA tarzında kullanılabileceği bir noktadır. Her neyse benim fikrim.
Raffaello
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.