Attualmente sto progettando un'applicazione e sono confuso su come suddividere la mia applicazione monolite. Dopo aver fatto qualche ricerca, gli attori del fabric di servizio sembrano essere la soluzione migliore per l'elaborazione semplice, ma sono confuso sull'approccio che dovrei adottare.
Come funziona la mia applicazione corrente nel mio monolite:
- Il messaggio IRC arriva da un utente attraverso un evento socket.
- Un processore analizza il messaggio e individua il comando (utilizzando MEF ) che dovrebbe in definitiva elaborare il messaggio. Ad esempio, se il comando fosse "! Help", individuerebbe il comando help e invierà il messaggio lì. Il processore cerca anche le impostazioni dell'utente (ad esempio, possono modificare le impostazioni! In a #, e il processore dovrebbe cercare "#help" invece di "! Help" e passa un enorme oggetto settings (come contesto fondamentalmente) al comando: utilizzo qualcosa di molto simile a ciò che JabbR fa qui .
-
Se un comando non viene trovato (ex! asdf).:
A. Il canale ha un set di comandi predefinito: il comando viene inviato a quello. (ad esempio! Asdf non è stato trovato, e hanno un aiuto come comando predefinito. Il messaggio è fondamentalmente elaborato come! help asdf).
B. Il canale non ha un set predefinito: il messaggio viene ignorato.
-
Il messaggio viene elaborato tramite quel comando.
Idealmente, vorrei che ogni comando avesse il proprio servizio (sono unità di lavoro separate). Alcuni pensieri su come potrei progettare questo tramite un microservizio:
- Il messaggio proviene da un utente e un canale tramite un argomento del bus di servizio.
- Un processore analizza il messaggio e spara un attore (con l'ID attore che è l'ID del canale associato a quel messaggio) che elaborerà il messaggio. Il processore dovrebbe gestire l'elenco di servizi associati a ciascun messaggio e questo processore dovrebbe essere aggiornato su ogni aggiunta successiva di un servizio di comando.
- Il comando attore gestirà internamente lo stato, il che significa che le impostazioni saranno interne a se stesso. Un comando "ignora lista", gestirà il proprio elenco di ignora e fornirà ad altri processi la possibilità di visualizzare l'elenco di ignora. (In questo caso, il processore potrebbe / userebbe l'elenco di ignora per vedere se un utente è ignorato).
- Alcuni attori di lunga durata diventerebbero servizi di stato e gestiranno le proprie impostazioni per ciascun canale che accederà a quel servizio.
Un'altra soluzione:
- Il messaggio arriva da un utente tramite un argomento del bus di servizio.
- Un processore analizza il messaggio e spara un attore (con l'ID attore che è l'ID utente associato a quel messaggio) che elaborerà il messaggio. Il processore dovrebbe gestire l'elenco di servizi associati a ciascun messaggio e questo processore dovrebbe essere aggiornato su ogni aggiunta successiva di un servizio di comando.
- L'attore chiamerà un utente attore per gestire e ricevere le impostazioni.
- Alcuni attori di lunga durata diventerebbero servizi di stato e gestiscono le proprie impostazioni per ogni utente che acceda a quel servizio.
Una terza soluzione:
- Il messaggio arriva da un utente tramite un argomento del bus di servizio.
- Un processore analizza il messaggio e inserisce un messaggio in una coda del bus di servizio. Utilizzando un filtro SQL, ogni comando sarebbe un servizio stateless che potrebbe quindi collegarsi alla coda ed elaborare i messaggi associati a quel comando. In questo caso, un comando predefinito non sarebbe possibile (O dovrei interrogare l'elenco degli abbonati in coda e ottenere un elenco di regole che stanno tutti ascoltando e confrontare ogni comando con quell'elenco. a tirare questa lista a intervalli regolari per assicurarmi che nuovi servizi vengano aggiunti a questa lista.)
Quindi, per riassumere, ho 2 problemi: dove gestire le impostazioni per un utente e come gestire il passaggio dei comandi a attori o servizi. Come devo procedere?