Eventi push-based in un'architettura orientata ai servizi

4

Sono giunto a un punto, nella costruzione di un'architettura orientata ai servizi (in cima a Thrift), che ho bisogno di esporre eventi e permettere agli ascoltatori.

Il mio pensiero iniziale era "creare un EventService" per gestire la pubblicazione e l'iscrizione agli eventi. Tale EventService può utilizzare qualsiasi implementazione desideri per distribuire effettivamente gli eventi. Il mio client esegue automaticamente il roaming delle richieste di servizio agli host di servizio disponibili che vengono determinati utilizzando il rilevamento dei servizi basato su Zookeeper. Quindi, probabilmente utilizzerei JMS all'interno di EventService principalmente per lo scopo dei messaggi persistenti (nel caso in cui un host di servizio per EventService diminuisca prima che possa distribuire il messaggio a tutti i listener disponibili).

Quando ho iniziato a prendere in considerazione ciò, ho iniziato a esaminare le differenze tra code e argomenti. Gli argomenti purtroppo non funzionano per me, perché (almeno per ora), tutti gli ascoltatori devono ricevere il messaggio (anche se erano inattivi al momento in cui l'evento è stato spinto, o non hanno fatto un abbonamento ancora perché non hanno completato l'avvio (durante la distribuzione, per esempio) - i messaggi dovrebbero essere accodati fino a quando il servizio è disponibile).

Tuttavia, non voglio che EventService sia responsabile della gestione di tutti gli eventi. Non penso che dovrebbe avere il codice per reagire agli eventi al suo interno. Ciascuno dei servizi dovrebbe fare ciò di cui ha bisogno con un determinato evento. Ciò indicherebbe che ogni servizio necessiterebbe di una connessione JMS, che mette in dubbio il valore di avere EventService del tutto (poiché i servizi potrebbero pubblicare e sottoscrivere individualmente direttamente JMS). Tuttavia, accoppia anche tutti i servizi a JMS (quando preferirei che ci fosse un singolo servizio che è responsabile per determinare come distribuire gli eventi).

Quello che avevo pensato era di pubblicare un evento su EventService, che estraeva una configurazione di listener da qualche sorgente di configurazione (database, file flat, per ora irrilevante). Replica il messaggio e reinserisce ciascuno in una coda con informazioni specifiche per quel listener (quindi, se ci sono 3 ascoltatori, 1 evento diventerebbe 3 eventi in JMS). Quindi, un altro thread in EventService (che viene replicato, in esecuzione su più hots) estrarrà dalla coda, tenterà di effettuare la chiamata di servizio al "listener" e restituirà il messaggio alla coda (se il servizio è inattivo), o scartando il messaggio (se l'ascoltatore è stato completato con successo).

tl; dr

Se ho un EventService responsabile della ricezione di eventi e delega delle chiamate di servizio a "listener di eventi" (che sono in realtà solo endpoint su altri servizi), come dovrebbe sapere come creare la chiamata di servizio? Devo creare un oggetto generico "Event" condiviso tra tutti i servizi? Quindi, EventService può semplicemente costruire questo oggetto e passarlo alla chiamata di servizio. O c'è una risposta migliore a questo problema interamente?

    
posta Colin M 24.06.2013 - 17:26
fonte

2 risposte

1

Se il servizio deve ricevere il messaggio, anche se non è a conoscenza della sua esistenza, allora il modello di pubblicazione / sottoscrizione non è la risposta. Gli editori non dovrebbero conoscere i loro abbonati. L'abbonato dovrebbe preoccuparsi, non l'editore.

Se il "publisher" è responsabile del mantenimento dei messaggi, allora quello che vuoi è il polling.

    
risposta data 22.04.2014 - 22:08
fonte
0

Prima di tutto, questo servizio eventi introduce una sorta di orchestrazione. Questo servizio è strettamente collegato a tutti i servizi con cui interagisce, risultando in una comunicazione chiacchierata, molto probabilmente implementata con richiesta sincrona di risposta, che è probabilmente il più grande male di tutti .

Pensa a questo servizio quando orchestrerà 100 servizi. Sembra piuttosto spaventoso.

Oltre a ciò, la logica è inevitabilmente distribuita su due servizi: il servizio centrale di governo e il servizio invocato a causa di un problema che ho appena menzionato - la natura di comunicazione sincrona tra di loro.

Dopo tutto, questo sembra un approccio di tubi intelligenti. Sicuramente non va bene.

Qui è una buona e più dettagliata panoramica di questo approccio.

Or is there a better answer to this problem entirely?

Penso che ci sia. Lascia che tutti i tuoi servizi ascoltino gli eventi a cui sono interessati.

    
risposta data 14.11.2017 - 20:01
fonte

Leggi altre domande sui tag