Messaggistica leggera (invocazioni asincrone) in Java
Domanda
Sto cercando un framework di messaggistica leggero in Java. Il mio compito è quello di elaborare gli eventi in modo SEDA: so che alcune fasi dell'elaborazione potrebbero essere completate rapidamente e altre no, e vorrei disaccoppiare queste fasi dell'elaborazione.
Supponiamo che io abbia i componenti A e B e che il motore di elaborazione (sia questo contenitore o qualsiasi altra cosa) invochi il componente A, che a sua volta invoca il componente B. Non mi interessa se il tempo di esecuzione del componente B sarà 2s , ma a me importa se il tempo di esecuzione del componente A è inferiore a 50 ms, ad esempio. Pertanto, sembra molto ragionevole che il componente A invii un messaggio a B, che B elaborerà al momento desiderato.
Sono a conoscenza di diverse implementazioni JMS e Apache ActiveMQ: sono troppo pesanti per questo. Ho cercato inutilmente alcuni messaggi leggeri (con funzionalità davvero basilari come la serializzazione dei messaggi e il routing più semplice)
Hai qualcosa da consigliare in questo numero?
Soluzione
Hai bisogno di qualche tipo di persistenza (ad esempio se la tua JVM si interrompe tra l'elaborazione di migliaia di messaggi) e hai bisogno di messaggi per attraversare altre JVM?
Se è tutto in un'unica JVM e non devi preoccuparti di transazioni, recupero o perdita di messaggi se una JVM muore, allora come dice Chris sopra, gli Executors stanno bene.
ActiveMQ è piuttosto leggero; puoi usarlo in una singola JVM solo senza persistenza se vuoi; puoi quindi abilitare transazioni / persistenza / recupero / remoting (lavorando con più JVM) come e quando ne hai bisogno. Ma se non hai bisogno di nessuna di queste cose, allora è eccessivo - usa solo Executors.
Per inciso, un'altra opzione se non si è sicuri di quali passaggi potrebbero richiedere persistenza / affidabilità o bilanciamento del carico su più JVM sarebbe nascondi completamente l'uso del middleware in modo da poter passare tra le code SEDA in memoria con gli esecutori a JMS / ActiveMQ come e quando è necessario.
es. è possibile che alcuni passaggi debbano essere affidabili & amp; recuperabile (quindi necessita di qualche tipo di persistenza) e altre volte no.
Altri suggerimenti
Davvero leggero? Executors . :-) Quindi hai impostato un esecutore (B, nella tua descrizione) e A ha semplicemente inviato compiti all'esecutore.
Penso che Apache Camel copra tutte le tue esigenze. Funziona all'interno della JVM e supporta lo stile SEDA ( http://camel.apache.org/seda.html ) e routing simpe. Può essere utilizzato da solo o con spring, con un provider JMS o altri adattatori.
Ci scusiamo per aver resuscitato un vecchio thread, ma forse aiuta qualcun altro a leggerlo ... Penso che FFMQ è un buon candidato per un framework di messaggistica leggero.
AGGIORNAMENTO: tuttavia non sono sicuro che supporti i ritardi di riconsegna (il problema delle dead-code-queue). Lo troverei utile anche per i fornitori leggeri. Ma suppongo che potrebbe essere possibile con una combinazione di query MessageSelector e proprietà del messaggio.
Per aiuto a qualcun altro leggi questa discussione:
Uno dei framework di messaggistica più leggeri è Mbasseder .
MBassador è un'implementazione del bus messaggi (evento) molto leggera che segue il modello di sottoscrizione di pubblicazione. È progettato per essere facile da usare e mira ad essere ricco di funzionalità ed estendibile, preservando al contempo l'efficienza e le prestazioni delle risorse.
Il cuore delle alte prestazioni di MBassador è una struttura di dati specializzata che minimizza la contesa di blocchi in modo tale che il degrado delle prestazioni dell'accesso simultaneo sia minimo.
Caratteristiche: definizione di listener dichiarativa tramite annotazioni, sincronizzazione e / o consegna di eventi asincroni, riferimenti deboli, filtro messaggi