Prima di tutto, i sistemi di messaggi "più vecchi" (MQ) sono più vecchi nell'implementazione ma sono un'idea più recente nell'ingegneria delle code persistenti transazionali . Scala Actors e Akka potrebbero essere un'implementazione più recente, ma si basano su un vecchio modello di concorrenza degli attori.
Tuttavia, i due modelli finiscono per essere molto simili nella pratica perché entrambi sono basati su messaggi di eventi: vedi la mia risposta a RabbitMQ vs Akka .
Se codifichi solo per JVM, Akka è probabilmente una buona scelta. Altrimenti userei RabbitMQ.
Inoltre, se sei uno sviluppatore Scala, Akka dovrebbe essere un gioco da ragazzi. Tuttavia, i collegamenti Java di Akka non sono molto Java e richiedono il cast a causa del sistema di tipi di Scala.
Anche in Java le persone in genere non creano oggetti immutabili, cosa che ti consiglio di fare per la messaggistica. Di conseguenza è molto facile in Java fare accidentalmente qualcosa usando Akka che non si ridimensionerà (usando oggetti mutabili per i messaggi, basandosi su uno strano stato di callback di chiusura). Con MQ questo non è un problema perché i messaggi vengono sempre serializzati a scapito della velocità. Con Akka generalmente non lo sono.
Akka si adatta anche meglio alla maggior parte dei consumatori rispetto alla maggior parte di MQ. Questo perché per la maggior parte dei client MQ (JMS, AMQP) ogni connessione di coda richiede un thread ... quindi molte code == molti thread in esecuzione permanente. Tuttavia, questo è principalmente un problema del cliente. Penso che ActiveMQ Apollo abbia un dispatcher non bloccante che presumibilmente risolve il problema per AMQP. Il client RabbitMQ ha canali che consentono di combinare più consumatori, ma ci sono ancora problemi con un gran numero di consumatori che potenzialmente causano deadlock o connessioni a morire, quindi generalmente vengono aggiunti più thread per evitare questo problema.
Detto questo, il remoting di Akka è piuttosto nuovo e probabilmente non offre ancora tutte le garanzie di messaggi affidabili e QoS fornite dalle code di messaggi tradizionali (ma questo cambia ogni giorno). È anche generalmente peer-to-peer, ma penso che supporti il server-to-peer che è generalmente ciò che fa la maggior parte dei sistemi MQ (cioè single point of failure) ma ci sono sistemi MQ che sono peer-to-peer (RabbitMQ è server- to-peer).
Alla fine RabbitMQ e Akka fanno davvero una buona coppia. Puoi utilizzare Akka come wrapper per RabbitMQ in particolare poiché RabbitMQ non ti aiuta a gestire il consumo di messaggi e instradare i messaggi localmente (in una singola JVM).
Quando scegliere Akka
- Avere molti consumatori (pensa milioni).
- Serve una bassa latenza
- Aperto al modello di concorrenza degli attori
Sistema di esempio: un sistema di chat interattivo in tempo reale
Quando scegliere MQ
- Necessità di integrazione con molti sistemi diversi (es. Non JVM)
- L'affidabilità dei messaggi è più importante della latenza
- Vorrei più strumenti e interfaccia utente di amministrazione
- A causa dei punti precedenti è migliore per le attività di lunga durata
- Vorrebbe utilizzare un modello di concorrenza diverso rispetto agli attori
Sistema di esempio: un sistema di elaborazione batch transazionale pianificato
MODIFICA in base ai commenti interessati
Ho ipotizzato che l'OP fosse interessato all'elaborazione distribuita che sia Akka che le code di messaggi possono gestire. Questo è che presumo stesse parlando di Akka distribuito . L'uso di Akka per la concorrenza locale è un confronto tra mele e arancioni con la maggior parte delle code di messaggi . Dico di più perché puoi applicare il modello di coda dei messaggi localmente come un modello di concorrenza (cioè argomento, code, scambi) che sia la libreria Reactor che la semplice reazione .
La scelta del modello / libreria di concorrenza corretto è molto importante per le applicazioni a bassa latenza. Una soluzione di elaborazione distribuita come una coda di messaggi in genere non è l'ideale perché l'instradamento viene quasi sempre eseguito in rete, il che è ovviamente più lento rispetto all'applicazione e quindi Akka sarebbe una scelta migliore. Tuttavia credo che alcune tecnologie MQ proprietarie consentano il routing locale. Inoltre, come ho detto prima, la maggior parte dei client MQ sono piuttosto stupidi riguardo al threading e non si affidano a IO non bloccanti e hanno un thread per connessione / coda / canale ... ironicamente l'io non bloccante non è sempre a bassa latenza ma è generalmente più risorsa efficiente.
Come puoi vedere, l'argomento della programmazione distribuita e della programmazione concorrente è piuttosto ampio e cambia ogni giorno, quindi la mia intenzione originale non era confusa, ma piuttosto concentrarsi su una particolare area dell'elaborazione dei messaggi distribuiti che è ciò di cui pensavo fosse interessato l'OP. In termini di concorrenza, si potrebbe voler concentrare le proprie ricerche sulla programmazione "reattiva" (RFP / flussi) che è un modello "più recente" ma simile al modello attore e al modello coda messaggi di cui tutti questi modelli possono essere generalmente combinati perché sono basati sugli eventi.