- Załóżmy że mamy sobie jakiś serwis X, który ciągnie sobie dane z jakiejś SQLowej bazy danych i tam też chciałby utrwalać zmiany.
- Załóżmy że możemy mieć N instancji tego serwisu.
- Załóżmy że chcemy tam użyć subscription z GraphQL, więc chcemy informować frontend o zachodzących zmianach (czyli frontend nie robi nowego requestu po dane, tylko dostaje od nas websocketem delty)
- Załóżmy, że chcemy trzymać stan aplikacji w pamięci i nie ładować przy każdym requeście rzeczy od zera z bazy (to tylko dla ustalenia uwagi, bo niczego to specjalnie nie zmienia tutaj)
Problem: przychodzi jakiś POST z frontendu (czy tam mutacja z GraphQLa) i teraz potrzebujemy:
- Przepuścić to przez logikę domenową, żeby sprawdzić czy ta operacja w ogóle ma sens
- Jeśli tak, to potrzebujemy poinformować frontend o zmianie + potrzebujemy zmianę utrwalić w bazie
- Jak nie trudno zauważyć, potrzebujemy też jakoś poinformować inne instancje o tym że zaszły zmiany, żeby mogły odpowiednio updatować swój stan oraz poinformować klientów frontendu którzy są do nich wpięci
Najbardziej oczywiste rozwiązanie byłoby takie:
- Instancja która odebrała request przepycha to przez logikę domenową i jeśli request ma sens, to utrwala zmiany w bazie, emituje event dla innych instancji i informuje swoich klientów o zmianach
- Pozostałe instancje odbierają event, przepychają go przez logikę domenową i informują swoich klientów o zmianach
Nie podoba mi sie tutaj trochę to, że w sumie mamy tu 2 flowy. Można by to mocno uprościć, gdyby instancja która odebrała request po prostu emitowała automatyczne event, a potem wrzucenie tego w logikę domenową plus informowanie klientów odbywało się z event handlera. Tylko że pojawia się tutaj problem persystencji, bo ktoś to finalnie musi zapisać do bazy a w takim modelu nie bardzo wiadomo kto powinien być za to odpowiedzialny.
Oczywiście można by dołożyć jeszcze drugi serwis, który łykałby event i zajmował się tylko zapisywaniem zmian w bazie, czyli takie trochę CQRS, bo wtedy serwis X byłby tylko od czytania a ten nowy serwis zajmowałby się pisaniem, ale mam wątpliwości czy uda mi się przepchnąć taki design...
Da się to jakoś sprytniej zrobić? Nitka idź!