Öncelikle, "eski" mesaj sistemleri (MQ) uygulamada daha eskidir, ancak bunlar mühendislik fikrinde daha yenidir : işlemsel kalıcı kuyruklar . Scala Actors ve Akka daha yeni bir uygulama olabilir, ancak daha eski bir Actors eşzamanlılık modeli üzerine inşa edilmiştir.
Bununla birlikte, iki model pratikte birbirine çok benziyor çünkü ikisi de olay mesajına dayalı: RabbitMQ vs Akka'ya cevabımı görün .
Yalnızca JVM için kodlama yapacaksanız, Akka muhtemelen iyi bir seçimdir. Aksi takdirde RabbitMQ kullanırım.
Ayrıca bir Scala geliştiricisi iseniz, Akka hiç akıllıca olmamalıdır. Ancak Akka'nın Java bağlamaları çok Java'ya özgü değildir ve Scala'nın tip sistemi nedeniyle döküm gerektirir.
Ayrıca Java'da insanlar genellikle mesajlaşma için yapmanızı tavsiye ettiğim değişmez nesneler yapmazlar. Sonuç olarak, Java'da Akka'yı kullanarak ölçeklenmeyecek bir şeyi yanlışlıkla yapmak çok kolaydır (mesajlar için değişken nesneler kullanarak, garip kapatma geri arama durumuna dayanarak). MQ ile bu bir sorun değildir çünkü mesajlar her zaman hız pahasına serileştirilir. Akka ile genellikle değiller.
Akka, aynı zamanda çoğu MQ'dan çok sayıda tüketiciyle daha iyi ölçeklendiriyor. Bunun nedeni, çoğu MQ (JMS, AMQP) istemcisi için her kuyruk bağlantısının bir iş parçacığı gerektirmesidir ... bu nedenle çok sayıda kuyruk == kalıcı olarak çalışan çok sayıda iş parçacığı. Bu esasen bir müşteri sorunudur. ActiveMQ Apollo'nun, AMQP için bu sorunu düzelttiği iddia edilen, engellemeyen bir dağıtıcıya sahip olduğunu düşünüyorum. RabbitMQ istemcisi, birden fazla tüketiciyi birleştirmenize izin veren kanallara sahiptir, ancak yine de çok sayıda tüketiciyle ilgili sorunlar potansiyel olarak kilitlenmelere veya bağlantıların ölmesine neden olabilir, bu nedenle genellikle bu sorunu önlemek için daha fazla iş parçacığı eklenir.
Akka'nın uzaktan kumandasının oldukça yeni olduğu ve muhtemelen hala geleneksel mesaj kuyruklarının sağladığı tüm güvenilir mesaj garantilerini ve QoS'yi sunmadığı söyleniyor (ancak bu her gün değişiyor). Aynı zamanda genel olarak eşler arasıdır, ancak genellikle çoğu MQ sisteminin yaptığı şey olan (yani tek hata noktası) sunucudan eşe desteği desteklediğini mi düşünüyorum, ancak eşler arası MQ sistemleri var (RabbitMQ, eşler arası).
Sonunda RabbitMQ ve Akka gerçekten iyi bir çift oldu. Akka'yı özellikle RabbitMQ için bir sarmalayıcı olarak kullanabilirsiniz çünkü RabbitMQ, mesajların tüketimini yönetmenize ve mesajları yerel olarak (tek bir JVM'de) yönlendirmenize yardımcı olmaz.
Akka ne zaman seçilmeli
- Çok sayıda tüketiciye sahip olun (milyonları düşünün).
- Düşük gecikmeye ihtiyaç var
- Aktör eşzamanlılık modeline açık
Örnek sistem: Etkileşimli gerçek zamanlı sohbet sistemi
MQ ne zaman seçilir?
- Çok sayıda farklı sistemle (yani JVM olmayan) entegre edilmesi gerekiyor
- Mesaj güvenilirliği gecikmeden daha önemlidir
- Daha fazla araç ve yönetici kullanıcı arayüzü ister misiniz
- Önceki noktalar nedeniyle uzun süren görevler için daha iyidir
- Actors'dan farklı bir eşzamanlılık modeli kullanmak istiyor
Örnek sistem: Planlanmış bir işlemsel toplu işleme sistemi
İlgili yorumlara göre DÜZENLE
OP'nin hem Akka hem de Mesaj Kuyruklarının üstesinden gelebileceği dağıtılmış işlemeyle ilgilendiğini varsaydım. Yani dağıtılmış Akka'dan bahsettiğini sanıyordum . Yerel eşzamanlılık için Akka'yı kullanmak, çoğu ileti kuyruğuna kıyasla elma ile turuncudur . Çoğunu söylüyorum çünkü mesaj kuyruğu modelini hem Reactor kütüphanesinin hem de simple-react'in yaptığı bir eşzamanlılık modeli (yani konu, kuyruklar, değiş tokuşlar) olarak yerel olarak uygulayabilirsiniz .
Düşük gecikmeli uygulamalar için doğru eşzamanlılık modelini / kitaplığını seçmek çok önemlidir. İleti kuyruğu gibi dağıtılmış bir işleme çözümü genellikle ideal değildir çünkü yönlendirme neredeyse her zaman tel üzerinden yapılır ve bu uygulama içinde olduğundan açıkça daha yavaştır ve bu nedenle Akka daha iyi bir seçim olur. Ancak bazı tescilli MQ teknolojilerinin yerel yönlendirmeye izin verdiğine inanıyorum. Ayrıca daha önce bahsettiğim gibi, çoğu MQ istemcisi iş parçacığı oluşturma konusunda oldukça aptaldır ve engellemeyen GÇ'ye güvenmez ve bağlantı / kuyruk / kanal başına bir iş parçacığı vardır ... ironik olarak engellemeyen io her zaman düşük gecikme değildir, ancak genellikle daha fazla kaynaktır verimli.
Gördüğünüz gibi, dağıtılmış programlama ve eşzamanlı programlama konusu oldukça büyük ve her gün değişiyor, bu yüzden asıl amacım kafa karıştırmak değildi, daha ziyade OP'nin ilgilendiği şey olan dağıtılmış mesaj işlemenin belirli bir alanına odaklanmaktı. Eşzamanlılık açısından, aramalarını "daha yeni" ancak aktör modeline ve mesaj kuyruk modeline benzer bir model olan "reaktif" programlamaya (RFP / akışlar) odaklamak isteyebilir. olay tabanlıdır.