Cześć.
Użyłem słowa "dobrawego" bo mam na uwadze, że na jakieś kompromisy zawsze trzeba iść, nie mówię o idealnym API, tylko o takim z którego da się dość dobrze korzystać.
Ponad pół roku temu zostałem przydzielony do nowego projektu (jako frontend developer) który ma powstać na architekturze mikroserwisów. System do przetwarzania bardzo dużych formularzy (1 formularz na kilkanaście/dziesiąt stron). Na początku się ucieszyłem, bo do tej pory pisałem aplikację wykorzystywaną wewnątrz firmy - więc w końcu jakiś przeskok. Frontend jakoś sobie zrobiłem, nie było makiet więc nie wyglądało to jakoś rewelacyjnie - ale w miarę działało. Przyszło do podpięcia backendu i frontendu. Wtedy już miałem pewne wątpliwości. Zdziwiłem się bo zapis Formularza był rozbity na kilkanaście/dziesiąt requestów - dowiedziałem się, że przyjęli takie podejście żeby wyeliminować konieczność rollbacków w sytuacji gdy z jakiegoś powodu jeden mikroseriws rzuciłby błędem. Rozdzielili (nie mając przyklepanego jak ma to docelowo wyglądać) dane przechowywane w różnych mikroserwisach, tak że dane na jednej stronie pochodzą z jednego mikroserwisu. Wyciągnąć całego obiektu żeby zrobić poprawnie nawigację i mechanizm generowania przekierowań do pól na formularzu nie mogę (bo takiego endpointu nie ma). O ile zapis jestem jakoś wstanie zrozumieć, tak to kompletnie jest dla mnie głupotą.
Mam dopiero półtora roku doświadczenia i może źle to wszystko pojmuję, ale czy odpowiedzialność backendu i frontendu powinna być oddzielona jak najbardziej się da? W takim sensie, że jeżeli funkcją systemu (od strony biznesowej) jest przetworzenie formularza, to API powinno być tak zaprojektowane, żeby udostępniało możliwość wyciągnięcia Formularza oraz jego zapisu w całości?
Przy wyciąganiu formularza to nawet nie wiem jakie argumenty dostałem, bo niektóre były tak mało sensowne, że nawet ich nie zapamiętałem. Jedyny argument w miarę sensowny był taki, że szybciej jest wysłać kilkadziesiąt małych DTO niż jedno wielkie. I poniekąd się z tym zgodzę. Jeżeli backend miałby coś takiego zrobić to standardowe podejście ze Sprigna by nie miało prawa bytu tutaj bo rzeczywiście mogłyby polecieć jakieś timeouty, z kolei jeżeli frontend miałby to wszystko scalić to tutaj jest się ograniczonym przez przeglądarkę - z tego co czytałem, np chrome może równolegle wysłać 6 requestów dla jednego origina/domeny (nie pamiętam już), potem je pewnie kolejkuje. Z kolei nic mi nie wiadomo o tym, żeby backend takie ograniczenia posiadał. O ile dobrze zrozumiałem, to Webflux oferuje nieblokujące requesty (podobnie jak np. express.js) więc gdyby wystawić jeden główny mikroserwis do komunikacji z backendem i frontendem - nie byłoby to aż tak źle ( https://medium.com/@filia.aleks/microservice-performance-battle-spring-mvc-vs-webflux-80d39fd81bf0 nie wiem ile ten benchmark jest warty, ale w niektórych sytuacjach WebFlux jest nawet 4x wydajniejszy). Jak wtedy backend sobie przechowuje te dane - frontend ma wywalone na to. Podobnie z zapisem (tylko tutaj jakoś jestem wstanie to zrozumieć).
Jeżeli formularz jest przechowywany na 3+ mikroserwisach: A,B,C gdzie C jest agregatem A i B, oraz A i B nie zależą bezpośrednio od siebie, to czy poruszając się wewnątrz kontekstu C, A nie wpływa pośrednio na B? Przecież jeżeli A się wywali, to co z tego że B działa jak A wpływa na to, że nie można korzystać z funkcji udostępnianego przez C? Więc nawet jak wyciągnę B, to nic mi to nie daje bo Formularz przy zapisie się wysypie. Mam wrażenie, że następuje tutaj próba rozwiązania problemu wydajnościowego bazy danych przez zastosowanie mikroserwisów zamiast NoSQL (niestety NoSQL nie można użyć w tym projekcie).