Obecna sytuacja
Wdrażamy (i obecnie utrzymujemy) aplikację internetową do zakupów online w architekturze mikrousług.
Jednym z wymagań jest to, że firma musi być w stanie stosować zasady dotyczące tego, co nasi klienci dodają do koszyka, w celu dostosowania ich doświadczenia i ostatecznego zamówienia. Z pewnością trzeba było wprowadzić silnik reguł biznesowych i wdrożyliśmy do tego specyficzną „mikrousługę” (jeśli nadal moglibyśmy to tak nazwać).
W ciągu roku ten silnik reguł stawał się coraz bardziej złożony, wymagając coraz większej ilości danych (np. Zawartości koszyka, ale także informacji o użytkowniku, jego roli, istniejących usługach, niektórych danych rozliczeniowych itp.), Aby móc obliczyć te reguły.
Na razie nasza shopping-cart
mikrousługa zbiera wszystkie te dane z innych mikrousług. Mimo że część tych danych jest używana przez shopping-cart
większość czasu, są one głównie wykorzystywane do zasilania silnika reguł.
Nowe wymagania
Teraz pojawia się potrzeba, aby inne aplikacje / mikrousługi ponownie wykorzystały silnik reguł do podobnych wymagań. W obecnej sytuacji musieliby zatem przesyłać ten sam rodzaj danych, wywoływać te same mikrousługi i budować (prawie) te same zasoby, aby móc wywołać silnik reguł.
Kontynuując, napotkamy kilka problemów:
- każdy (wywołujący silnik reguł) musi ponownie wdrożyć pobieranie danych, nawet jeśli nie potrzebuje ich dla siebie;
- żądania do silnika reguł są złożone;
- kontynuując w tym kierunku, będziemy musieli przetransportować te dane w całej sieci dla wielu żądań (pomyśl o μs A wywołującej μs B wywołującej silnik reguł, ale A ma już niektóre dane, których potrzebuje silnik reguł);
shopping-cart
stał się ogromny z powodu pobierania wszystkich danych;- Prawdopodobnie zapominam o wielu…
Co możemy zrobić, aby uniknąć tych problemów?
Idealnie byłoby uniknąć dodawania większej złożoności do silnika reguł. Musimy również upewnić się, że nie stanie się ono wąskim gardłem - na przykład niektóre dane są dość wolno pobierane (10 s lub nawet więcej), więc wdrożyliśmy wstępne pobieranie, shopping-cart
tak aby dane były bardziej prawdopodobne przed wywołaniem reguł silnik i zadbaj o komfort użytkowania.
Jakieś pomysły
- Pozwól, aby silnik reguł pobierał potrzebne dane. Zwiększyłoby to jeszcze bardziej złożoność, naruszając zasadę pojedynczej odpowiedzialności ( nawet więcej… );
- Zaimplementuj serwer proxy μs przed mechanizmem reguł, aby pobrać dane;
- Zaimplementuj „moduł pobierania danych” μs, który wywołuje silnik reguł, aby pobrać wszystkie potrzebne dane naraz (zapytanie złożone).
shopping-cart
, ale możemy dość łatwo dostosować go do potrzeb innych mikrousług (nadal są one związane z użytkownikami, produktami i zamówieniami). Jak widzimy, będą potrzebować tych samych danych wejściowych, zwłaszcza, że firma jest w stanie wybrać predykaty do zastosowania. Wszystkie dane są dostarczane przez inne mikrousługi z wyjątkiem samej zawartości koszyka. Pobieranie danych nie jest skomplikowane per se , ale staje się skomplikowana, kiedy trzeba zadzwonić ~ 10 innych microservices i utrzymać strukturę oczekiwanego przez silnik reguł.