Hej
takie oto zadanie rekrutacyjne. Osobiście nie podchodzę, ale jestem ciekawa jak byście to zrobili i czego użyli.
Jest API REST które wystawia 3 operacje, np linie lotnicze, klienci, dostawcy. Każdy ten endpoint zwraca listę wyników i pobiera jeden parametr na podstawie którego generuje wyniki.
Przykładowo:
/linie?linie=L1,L2
/klienci?klienci=k1,k2,k3
Masz napisać endpoint agregujący wywołania powyższych 3 endpointów, którzy ma taką sygnaturę:
/agregator?linie=l1,l2&klienci=k1,k2&dostawcy=d1,s2
który pod spodem wywoła te 3 endpointy.
część 1, Endpoint
zaimplementuj ten endpoint tak, aby zwracać odpowiedź do klienta, gdy otrzymano wszystkie odpowiedzi z tych wszystkich 3 podanych endpointów.
cześć 2, Grupowanie wywołań po 5
zaimplementuj tak, aby gdy masz dla danego endpointu min 5 wartości jego paramteru np ?linie=l1,l2,l3,l4,l5
to dopiero wtedy wywołujesz ten endpoint. Jeśli masz mniej np 4 to go jeszcze nie wywołujesz.
Dopiero gdy pojawi się 5ty wtedy wywołujesz dany endpoint.
Przykład:
klienci api agregacyjnego wywołali:
klient1:
/agregator?linie=l1,l2&klienci=k1,k2&dostawcy=d1,d2
Tu na razie nie wywołujesz tych 3 endpointów, gdyż dla żądnego z nich nie masz min 5 wartości parametru. Są po 2.
Gdy następnie klient2 wywołał:
/agregator?linie=l7,l8,l9&klienci=k4&dostawcy=d8,s9
Wówczas agregator może wywołać endpoint /linie, tylko ten, gdzyż ma już 5 warości: l1,l2,l3,l7,l8
Część 3, timeouty
jak widać, dotychczasowa implementacja, ma wadę. Gdy klient wywoła
/agregator?linie=l1,l2,l3,l4,l5&klienci=k1,k2&dostawcy=d1,s2
to wywołamy endpoint /linie, ale nigdy nie wywołamy pozostałych.
Należy tak zmienić impl, aby gdy po upływie zdefiniowanego czasu np 5s, gdy dla danego endpointu nie mam zagregowanych min 5 wartości parametru, to mimo to wywołujemy ten endpoint.
Przykład
Klient1:
/agregator?linie=l2,l2&klienci=k1,k2&dostawcy=d1,s2
Nic się nie dzieje. Jeśli upłynie 5s od otrzymania tego requestu, to mimo braku 5 wartości dla każdego z endpointów, wywołujemy je i zwracamy wyniki do klienta.
Moje pytanie, jak byście to zaprojektowali i czego użyli: core api, jakichś zewn frameworków, kolejek itp?
Czas na wykonanie to około kilku godzin.