2013-02-07 11 views
19

Sto progettando il backend per una nuova app Web Java e sto cercando di decidere se utilizzare o meno un Event Bus; in particolare lo Guava EventBus.Quando utilizzare un bus eventi?

La maggior parte delle richieste lato server sarà sincrona: ovvero, l'utente sta richiedendo dati e ha bisogno di una risposta entro pochi secondi. Tuttavia, ci sono anche un bel numero di richieste che possono essere asincrone e che sono "fire and forget" sul lato client. Finché vengono elaborati, al cliente potrebbe importare di meno se sono necessari 2 secondi per l'elaborazione o 2 ore.

Per queste richieste asincrone, ho intenzione di fare in modo che il servlet in ascolto sull'URL mappato pubblichi le richieste in coda. Un consumatore quindi deselezionerà ogni richiesta e la indirizzerà al gestore appropriato. Questo è dove EventBus può o non può entrare in gioco. La logica aziendale per instradare la richiesta al gestore corretto è piuttosto complessa. Normalmente una via Camel sarebbe la soluzione perfetta. Nel mio caso d'uso, mi chiedo se posso solo collegare un gruppo di "processori" (gestori di eventi) allo stesso bus di eventi, e quindi avere ognuno di questi eventi che si accendono e ricevono gli eventi l'uno dall'altra fino a quando il risultato finale non è prodotta.

Vorrei dire che ho già esplorato con Apache Camel e che credo che Camel sia lo strumento giusto per il lavoro qui. Purtroppo, per ragioni al di fuori dello scopo di questa domanda, non lo userò. Così ho iniziato a escogitare soluzioni simili a Camel, che è il modo in cui sono arrivato allo EventBus di Guava. Ma potrebbe non essere un sostituto adatto.

Immagino che sto cercando la classificazione del problema che risolve il modello Event Bus, e quindi ho bisogno di determinare se corrisponde al mio caso d'uso qui.

risposta

35

Ecco la dichiarazione del problema che EventBus risolve in poche parole:

"Voglio un modo centralizzato semplice per comunicare il codice che è interessato a tipi specifici di eventi quando si verificano questi eventi senza alcun accoppiamento diretto tra il codice che pubblica un evento e il codice che lo riceve. "

Quando si dice "la logica di business per il routing la richiesta al gestore corretto è piuttosto complessa", ho sospetto che EventBus non può essere quello che stai cercando, come percorsi basati sulla sola classe oggetto Java (sebbene tu possa fare alcune cose fantasiose con l'implementazione di interfacce sulle tue classi di eventi e la sottoscrizione di abbonati a interfacce specifiche).

+1

Grazie @ColinD (+1) - sì, credo che stavo pensando che ogni sottoscrittore/processore potrebbe rimbalzare un evento attorno al bus degli eventi come un flipper all'interno di un flipper. Ad ogni sottoscrittore, l'evento verrebbe modificato, in modo molto simile al modo in cui il 'Message' /' Exchange' viene modificato all'interno dei processori Camel. Sono ancora combattuto tra l'utilizzo o semplicemente il cablaggio manuale dei processori. È il disaccoppiamento a cui sono interessato, ma 'EventBus' non sembra ancora la migliore soluzione (non Camel). Ti sto dando l'assegno verde e ti riporterò con la mia decisione e i risultati. Grazie ancora! – IAmYourFaja

+0

È una sorta di mediatore. – zgulser