Hangi tasarım kararları JMS yerine Scala'nın Aktörlerini tercih ederdi?


83

JMS yerine Scala Actors kullanmanın farklılıkları nelerdir?

Örneğin performans ve ölçeklenebilirlik açısından Scala Actor modeli, JMS'ye kıyasla ne katıyor? Hangi durumlarda Aktörleri kullanmak JMS yerine daha mantıklıdır, yani Aktörler JMS'nin karşılayamayacağı hangi sorunları ele alır?

Yanıtlar:


113

JMS ve Scala oyuncuları teorik bir benzerliği paylaşıyorlar ancak onların aynı problemleri mimari olarak çözdüklerini düşünmüyorlar. Aktörlerin, yarışların ve kilitlenmelerin kazara yaratılmasının genellikle daha zor olduğu paylaşılan bellek eşzamanlılığına hafif bir alternatif olması amaçlanmıştır. JMS, doğrudan mesajlaşma, yayınlama / abone olma, işlemler, EJB entegrasyonu vb. Konularını kapsayan gelişmiş bir API'dir.

Bir aktöre en yakın JMS eşdeğeri, kalıcı olmayan, işlemsel olmayan, pub / sub olmayan bir kuyrukla desteklenen mesaj odaklı bir bean olacaktır. Ben buna "basit JMS fasulyesi" diyeceğim.

Şimdi sorularınıza.

JMS, bir uygulamadan çok bir spesifikasyon olduğundan, performans hakkında konuşmak zor bir konudur. Hiçbiri-ne olursa olsun, basit JMS bean kullanırken, performansın kabaca benzer olmasını beklerim, belki de oyuncuya zaman ve bellek açısından biraz avantaj sağlar. JMS'ye pub / sub gibi yetenekler ekledikçe, işlemler vb. Performans doğal olarak daha da düşecektir, ancak o zaman elmaları portakallarla karşılaştırmaya çalışıyorsunuz.

Ölçeklenebilirliğe gelince, basit JMS çekirdekleri, aktörler ile hemen hemen aynı şekilde ölçeklenmelidir. JMS karışımına işlem eklemek, işlemlerin kapsamına bağlı olarak doğal olarak ölçeklenebilirliğe bir miktar zarar verecektir.

JMS'nin yapamadığı aktörlerin ne yaptıklarıyla ilgili daha geniş soru. Pekala, yerleşik pub alt veya işlemleri olmadan aktörler JMS'den çıkarıyor gibi görünüyor - ve genel olarak bu doğru. Ama olay şu: oyuncular o kadar az koda ihtiyaç duyuyor ki onları çok ince taneli eşzamanlılık için mutlu bir şekilde kullanabilirim. Sıradan Java kodunda "JMS'ye ve bağımlılıklarına ya da gerektirdiği kodlara vb. Bulaşmak istemiyorum, bu yüzden sadece bir iş parçacığı oluşturacağım, bir kilit kullanacağım ve bir veri yapısını paylaşacağım." Diyebilirim. Scala oyuncularıyla "Bir oyuncuyu kırbaçlayıp devam edeceğim" demem çok daha olası.

Tasarımda da felsefi bir farklılık var. Aktörlerin basit, yerleşik bir denetçi hiyerarşisi kavramı vardır. Aktörler genellikle "çökmesine izin ver" tasarımında kullanılır. Bir oyuncu herhangi bir nedenle ölürse, o oyuncuyu yeniden başlatmak, bir grup oyuncuyu öldürmek ve hepsini yeniden başlatmak veya bir grup oyuncuyu ve kendisini öldürmek gibi bu konuda ne yapılacağına karar vermekten başka bir aktör sorumludur, böylece başka bir aktör olabilir. problemle uğraşmak. Bu tür şeyler JMS'ye eklenebilir, ancak API'nin özü değildir ve bir şekilde dışarıdan yönetilmelidir.

Bu arada, JMS'nin kapsadığı alemlere daha fazla giren bir Scala oyuncu kütüphanesi için bkz. Akka . Akka, birçok ortak aktör hiyerarşi stratejisine de açıklayıcı bir yaklaşım getiriyor.


Sanırım bunu hallettim. Bunu açıklığa kavuşturmak için son birkaç paragrafı güncelledim ve ayrıca aktör hiyerarşileri hakkında da biraz açıkladım.
James Iry

2
Kristian, tam olarak değil. Akka oyuncuları genellikle Scala oyuncularından daha hafiftir. Ancak, API'leri ve yapılandırma ayarları biraz daha karmaşıktır. Scala aktörlerini gecikme / aktarım bir sorun olmadığında (örneğin, işçi görevlerini oluşturmak için) ve Akka aktörlerini oldukları zaman veya denetime ihtiyacım olduğunda kullanıyorum.
Alexander Temerev

9
Bence burada genel olarak bir JMS uygulamasının, Akka / Actors'un harici bir komisyoncu olmadan çalışabildiği bir harici komisyoncu gerektireceğini de belirtmek gerekir. Elbette, süreçler arası / ana bilgisayar mesajlaşmasını istiyorsanız, uygun şekilde seçim yaparsınız.
jasonk
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.