Rozwiązanie zagadki projektowej numer 2
W tej zagadce należało rozpatrzyć dwie kwestie.
Synchroniczność i asynchroniczność
Mając pewną długą operację zazwyczaj musimy zdecydować czy ma być ona wykonana synchronicznie czy asynchronicznie. Oba podejścia są dobre. Wybór zależy zatem od konkretnego przypadku. Ogólnie jeżeli nie mamy jakiś obostrzeń to wybór metody asynchronicznej jest co do zasady odpowiedni. Metoda synchroniczna powinna zostać wybrana jeżeli w trakcie trwania danej operacji inne działania mogą wpłynąć na jej wynik. Względnie w przypadku aplikacji webowych jeżeli kolejne żądania mogą spowodować nieprawidłowe działanie aplikacji.
Przykładowo dobrym miejscem na wykonanie akcji synchronicznej jest zdalna aktualizacja sterowników routera albo definicji raportu Jasper Reports. Czyli tam gdzie nie będziemy wstanie zagwarantować iż żądanie wysłane w trakcie operacji skończy się sukcesem.
Ten sam JVM czy inny
Jest to znacznie ciekawszy problem. Generalnie wszystko zależy od tego czy nasza operacja może doprowadzić do sytuacji w której JVM nie będzie mógł kontynuować pracy. Takich przypadków jest kilka.
Brak pamięci
Coraz rzadsza przypadłość. W czasach Javy 32bitowej i limitu niecałych 2GB na proces opłacało się wyrzucić ciężkie i pamięciożerne zadania do osobnego JVM. W razie wystąpienia wyjątku główny proces był nienaruszony. Dziś brak RAM dla JVM nie jest już problemem. Jak trzeba to się instaluje. Jak mało to się odpala coherence i współdzieli RAM pomiędzy maszynami.
Przepełnienie stosu wywołań i nieskończone pętle
W ogólności sytuacje gdzie zadanie idzie w przysłowiowe maliny. W takim wypadku siłowe ubicie procesu za pomocą SIGKILL jest zdecydowanie łatwiejsze niż próby ubicia wątku na działającym serwerze.
Nadużywanie GC w czasie działania
Sytuacja w której po zakończeniu pracy uruchamiany jest GC i radośnie sprząta… minutę, dwie… albo i więcej. Czasami tak bywa. Niestety uruchomienie GC może zablokować serwer… a to boli.
Synchroniczność wywołania zewnętrznego JVM
Mówiąc po polsku oczekiwanie na zakończenie uruchomionego procesu JVM. Zasady takie jak wymieniłem wyżej. Z tą różnicą, że opłaca się to robić tylko przy małej ilości użytkowników ponieważ osoby, które wyślą żądanie w trakcie działania procesu, ale nie wiedzą o jego uruchomieniu nie powinny spotykać się zbyt często z komunikatem w stylu „przerwa konserwacyjna”.