Mam main-service do którego użytkownik dodaje "taski". Te taski to tak naprawdę instancje wzorca Command.
W uproszczonej postaci gromadzone taski mogą wyglądać tak:
tasks = [
{ "operation": "foo", "config": {} },
{ "operation": "foo", "config": {} },
{ "operation": "bar" },
]
Użytkownik jak w pewnym momencie stwierdzi, że już dodał te taski które chciał, to może uruchomić ich wszystkich przetwarzanie. Przetwarzanie ma się odbywać przez odpowiadające serwisy: foo-service, bar-service.
W momencie zasygnalizowania chęci uruchomienia przetwarzania, planuję żeby main-service wsadziło na Kafkę wszystkie te zgromadzone taski. Taski foo lecą na foo-topic i będą konsumowane przez foo-service. Analogicznie z taskami bar.
Przetworzenie taska polega na wykonaniu GET do jeszcze innego serwisu który zwraca Listę, później in memory transformacji tej listy, i zapisaniu wyniku do np. pliku o losowym uuid nazwie.
Wykonywanie tasków jest idempotentne i mogę je wykonywać w dowolnej kolejności.
Czyli mój foo-service będzie listenował na foo-topic i po kolei przetwarzał swoje foo taski, itd.
Pytanie:
main-service musi się dowiedzieć, że skończyły się już przetwarzać wszystkie taski. Jak to zrobić? A co jeśli przetworzenie jakiegoś tasku się nie uda?
Myślałem o zrobieniu status-topic do którego foo-service, bar-service będą wysyłały informacje o każdym pomyślnie ukończonym tasku. Mogą wysyłać uuid taska na ten topic. Następnie main-service będzie z tego topica ściągał to i jakoś (jak?) zliczał czy wszystkie taski się wykonały np. usuwając z otrzymane uuid z seta uuid. A sam w sobie set uuid miałbym może w Redisie i tworzyłbym go w momencie publikacji wszystkich tasków na kafkę.
Co tutaj mogę poprawić albo całkowicie zmienić w podejściu?