Wpis z mikrobloga

Aplikowałem na stanowisko Junior Javowca i dostałem takie zadanie rekrutacyjne:

Using JAVA, write a solution that will take two methods (actions) in the API:

(POST) AddItem (ID, Name),[GET] GetItem (ID)


The application should use the CQRS pattern. The application should not have a database other than in-memory. The application should be configured for highest performance in terms of load:- CPU -RAM

and achieve the best possible performance in terms of number of requests / second.

Prepare a test (any technique, method, mechanism) that you think will best test the solution.


Zrobiłem już całą apkę używając paternu CQRS, tylko zastanawia mnie w jaki sposób można zwiększyć tę wydajność requestów, oraz CPU i RAMu, dodać jakieś stronicowanie?
No i jakie testy będą najlepsze?
Wystarczy przetestowanie commands i events?

#java #programowanie #programista15k #naukaprogramowania #pracait
  • 16
  • Odpowiedz
@stanleymorison:

Wg mnie:

Testy:
- unitowe (w izolacji)
- integracyjne - testujące całe use casy
- z ciekawosci możesz dodać microbenchmarkowe testy: https://www.baeldung.com/java-microbenchmark-harness ale o wydajności niżej...

Wydajność: nie wiem czy coś jeszcze z tego wyciśniesz. Dodajesz item z id i potem go pobierasz wg id. Podejrzewam, że masz jakąś hash mapę do trzymania tego in-memory. Czas dostępu do hash mapy jest stały - szybciej się nie da.
  • Odpowiedz
@stanleymorison: cqrs + rxjava + skalowanie kontrolerów pod odczyt lub zapis za pomocą Kubernetesa per microservice,

Tak to na przykład działa mniej na AWS Lambda, że jak lamda z endpointem od odczytu dostaje najwięcej requestow to Lambda się skaluje na 2-3 instancje plus load balancing rozdziela ruch
  • Odpowiedz
@stanleymorison: jak masz podpięta bazę h2, to weź sobie zrób coś takiego że wypisuje Ci SQL jakie lecą do bazy na konsoli i zobacz czy nie masz tam problemu n+1
ale raczej nie bo Ty masz tylko prostego geta
Możesz w sumie opakować return z repo za pomocą optional i nie robić dwóch zapytań najpierw jednego które sprawdza czy coś jest w bazie a potem pobrania tylko od razu pobierasz optional
  • Odpowiedz
@stanleymorison: jeśli chodzi o testy wydajności to najwiarygodniej wypadnie JMeter.
Jest trochę zabawy, żeby to skonfigurować dobrze i dużo zależy tak naprawdę jakie przyjmiesz założenia (czy 500ms response time to już za dużo czy nie?). Inna sprawa - jak chcesz wycisnąć więcej z aplikacji to musisz też dołożyć wątków w JMeterze, więc automatycznie spadnie Ci wydajność aplikacji, więc najlepiej gdybyś aplikację miał oddzielnie, a testy oddzielnie. Ale myślę, że nie będą
  • Odpowiedz
@stanleymorison: chyba umiem mniej niż junior, ale warto zwrócić uwagę że to API jest mało restowe - post nie powinien mieć ID

Btw nie wydaje mi się że zadanie rekrutacyjne zakłada obsługe kubernatesa wraz z setupem do autoskalowania ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@stanleymorison: Stronnicowanie + testy integracyjne. Jednostkowo nie ma co testować bo nie masz logiki. W .NET można poprawić wydajność API poprzez wykorzystanie asynchronicznej obsługi requestów (taski i async/await) i tym samym nie blokowanie głównego wątku aplikacji na czas obsługi żądania, co przekłada się na możliwą większą ilość żądań które mogą zostać obsłużone. Nie wiem czy jest coś podobnego w Java.

@wafel93: Id często jest generowane po stronie klienta. Poza tym
  • Odpowiedz
@wafel93: A to niby czemu? Czemu zakładasz że API jest restowe tylko wtedy gdy backend generuje id zasobu? Co w sytuacji, gdy id generowane jest poza API i tworzysz zasób który już ma swoje id.
  • Odpowiedz