Migliori pratiche per Java IPC
-
09-06-2019 - |
Domanda
qual è il metodo migliore per la comunicazione tra processi in un'app Java multithread.
Dovrebbe essere performante (quindi NO JMS per favore) facile da implementare e affidabile, in modo che oggetti e dati possano essere legati a un solo thread?
Qualsiasi idea è benvenuta!
Soluzione
Supponendo lo scenario 1 JVM, più thread, quindi effettivamente java.util.concurrent è il posto in cui cercare, in particolare le varie implementazioni di Queue.Tuttavia un'astrazione in più può essere carina e lì Jetlang sembra molto interessante, passaggio di messaggi Java leggero.
Altri suggerimenti
Potresti chiarire un po'?Intendi IPC in una singola JVM?(Più thread, sì, ma a livello di sistema operativo un solo processo.) O intendi più JVM?(E comunicazioni tra processi veramente a livello di sistema operativo.)
Se è il primo, allora forse qualcosa fuori java.util.concurrent, Piace ConcurrentLinkedQueue farebbe il trucco.(Passo il messaggio tra i miei thread con le classi da java.util.concurrent con successo.)
Se dovesse succedere più tardi, farò semplicemente un'ipotesi e suggerirò di dare un'occhiata RMI, anche se non penso che si qualifichi come completamente affidabile: dovresti gestirlo un po' più "praticamente".
Consiglio di esaminare l'intero java.util.concurrent pacchetto, che ha più classi per gestire la concorrenza e diversi mezzi di comunicazione tra i thread.Tutto dipende da cosa vuoi ottenere, poiché la tua domanda è piuttosto generale.
Dovresti utilizzare una coda produttore/consumatore.In questo modo eviti le insidie della programmazione multithread:condizioni di gara e situazioni di stallo.Inoltre non è solo più semplice e pulito, ma anche molto più veloce se usi una coda senza blocchi come Disruptor o MentaQueue.Ho scritto un articolo sul blog in cui ne parlo in dettaglio e mostro come ottenere latenze < 100 nanosecondi: Comunicazione inter-thread con latenza di nanosecondi a 2 cifre.
Ho appena aggiunto MappedBus su github (http://github.com/caplogic/mappedbus) che è un'efficiente libreria IPC che consente a diversi processi Java/JVM di comunicare scambiando messaggi e utilizza un file mappato in memoria per il trasporto.Il throughput è stato misurato a 40 milioni di messaggi/s.