Ho un sistema che ha 5 servizi. Ciascuno viene eseguito in un processo separato. Assomigliano a una catena di montaggio, nel senso che per lo più elaborano i messaggi nello stesso ordine 1- > 2- > 3- > 4- > 5, tuttavia non è sempre il caso che l'elaborazione sia lineare. Ci sono casi in cui è possibile saltare la catena (ad es. 1- > 2- > 5) o andare indietro (ad es. 1- > 2- > 4- > 3- > 1) o anche a zig-zag (1- > 2- > 4- > 3- > 5).
Il sistema viene alimentato con i payload per elaborarli uno ad uno, iniziando con il servizio 1. Dato che il sistema è asincrono e non lineare, non posso sapere quando l'intero sistema ha elaborato ciascuno dei payload. D'altra parte, voglio che il sistema si fermi a volte e la scelta migliore è non appena ha elaborato tutti i payload.
Queste soluzioni non sarebbero troppo buone:
- Una semplice uccisione o l'utilizzo di un approccio con pillola velenosa non funzionerebbe (esempio link ), come allora potrei finire per non elaborare il payload completamente (1- > 2- > 1 fallirebbe, dato che 1 sarebbe stato fermato dopo che 2 aveva ricevuto l'ultimo payload)
- Posso eseguire un approccio di timeout, tuttavia ciò non funzionerebbe per due motivi: a) ostacolerà lo sviluppo / test (ad es. se ho aspettato 1 minuto per un tempo di elaborazione effettivo di 5 secondi), b) i timeout possono ancora essere troppo basso, quindi potrei incorrere in problemi se alcuni servizi non hanno finito l'elaborazione
Stavo pensando di creare un altro servizio che servisse come un tipo di arresto a due fasi. L'idea andrebbe su queste linee:
- Qualsiasi servizio potrebbe chiamare stopper per dire "Voglio che il sistema si fermi"
- Stopper chiamerebbe tutti gli altri servizi e dir loro "Stop è stato richiesto"
- Gli altri servizi attenderanno fino a quando non elaboreranno ciò che hanno in coda e diranno stopper "Posso essere fermato"
- Il fermo attenderà che raccolga "Posso essere fermato" da tutti i servizi, quindi trasmetti "Esegui stop"
- Tutti i servizi andranno avanti e interrompono i rispettivi processi in modo aggraziato
Ho problemi con quanto sopra:
- Sembra eccessivamente complesso per il vantaggio (rispetto a "aspetta solo 1 minuto e poi interrompi" e non aggiunge alcun codice non commerciale), non sono sicuro che valga la pena di bilanciare
- Dovrei infondere logica legata all'arresto in tutti i servizi e dovrebbe essere accoppiato al meccanismo di accodamento (quindi sa quando non ci sono più messaggi di carico utile) e alla logica di business (quindi sa quando il carico utile stesso è finito l'elaborazione)
- Ci sono ancora alcuni casi limite da considerare. Per esempio. in 1- > 2- > 1 scenario, 1 potrebbe finire, 2 potrebbe elaborare l'ultimo payload, quando è fatto potrebbe inviare un messaggio a 1 e per fermare il servizio, stopper invierà "Esegui stop" e 1 potrebbe ricevere quel messaggio prima che ricevesse un messaggio da 2 che dovrebbe elaborare, quindi potrebbe fermarsi prematuramente
Ci sono buone pratiche o esempi su come ottenere questo in qualche altro modo? O forse limitando il sistema in qualche altro modo che renderebbe questo problema scomparire / più facile da gestire?