M-am mutat. Noul meu site este grep.ro, unde scriu ce scriam şi aici, doar că în engleză :)

HTTP caching

11 septembrie 2006, 21:08

La job am avut de făcut un sistem de caching al paginilor generate dinamic. Avem un server Tomcat (Java servlets) care generează pagini web folosind o bază de date - nimic neobişnuit aici. Problema e că baza de date e mare de tot, şi o să crească în timp. Generatul de pagini e destul de ok ca viteză, dar ne aşteptăm să avem mulţi clienţi în paralel; să generăm aceleaşi pagini pentru fiecare client, de fiecare dată, nu e o opţiune fezabilă.

Soluţia? Caching. Clientul nu are acces direct la serverul Tomcat; înaintea lui este un Apache, care funcţionează ca un proxy. Cere paginile de la Tomcat şi le serveşte înapoi clientului. Cu ocazia asta le salvează într-un cache. La clientul următor, Apache doar întreabă pe Tomcat dacă pagina s-a schimbat; dacă nu, Apache serveşte pagina din cache-ul propriu. În felul acesta pagina este regenerată numai când se schimbă informaţia din ea, şi nu e treaba mea să programez partea aia :)

Pe hârtie (sau pe ecran) sună foarte simplu - şi aşa şi este - numai după ce te prinzi cum #!$^%!#@ funcţionează header-ele HTTP de cache control, când să le trimiţi, şi ce valori să pui în ele. Mie mi-a luat vreo săptămână (în timp echivalent, pentru că de fapt lucrez de mai mult timp la asta, dar m-am ocupat şi de altele), mult googling, zeci de recompilări şi upload-uri pe server (care te scot practic din ritm, pentru că aştepţi un minut ca să poţi să testezi câte o modificare minusculă), citit serios sursele modulului de caching din Apache, modificat sursele respective, câteva compilări de Apache (am crezut că e un bug în el) - şi în final soluţia a fost să mut, în programul meu, două linii de cod cu trei rânduri în sus (nu se trimiteau header-ele când trebuia). Mizerabilă treabă.

Well, bine că merge. Acu să fac curat...