Jak podtrzymać “żywą” instancję aplikacji na Google App Engine
W poprzednim poście pisałem iż czas życia instancji aplikacji w kontenerze GAE jest bardzo ograniczony ? aplikacja ładowana jest w momencie zapytania ? pozostaje w pamięci przez krótki czas ? o ile nie nadejdzie kolejne zapytanie.
Przy małym ruchu powoduje to w praktyce ładowanie aplikacji dla każdego zapytania – używając np. Springframework powoduje to kilkunasto sekundowe opóźnienie w obsłudze zapytania ? co jest niedopuszczalne.
Jak na razie jedynym rozwiązaniem, choć nie jestem w 100% przekonany, iż można założyć, że kolejne zapytanie zostanie obsłużone przez tą samą instancję, a po drugie zjada to zasoby, jest odpytywanie dowolnego URL’a aplikacji w celu podtrzymania jej załadowanej w JVM.
Oto rozwiązanie, choć nie zalecane przez inżynierów Google, pozwala, przynajmniej w mojej aplikacji zredukować czas zapytania z 20s do 1s.
W pliku cron.xml skonfigurować trzeba periodyczne zadanie:
<?xml version="1.0" encoding="UTF-8"?> <cronentries> <cron> <url>/tools/ping.htm</url> <description>Ping app to keep JVM warm every 2 minutes</description> <schedule>every 2 minutes</schedule> </cron> </cronentries>
obsługa w kontrolerze wygląda następująco:
@RequestMapping("/tools/ping.htm") public void pingToKeepWarm(HttpServletResponse response) throws IOException { log.debug("Running ping..."); response.getWriter().write("OK"); response.setStatus(HttpServletResponse.SC_OK); }
zapytanie takie zjada około 5-10 ms CPU – niestety.










Zostaw odpowiedź!
Musisz się zalogować aby móc komentować.