Główna » Google App Engine, Polecane

Jak podtrzymać “żywą” instancję aplikacji na Google App Engine

12 January 2010 Brak komentarzy

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ć.