1 de noviembre de 2004

Servidores asesinos y cachés en aplicaciones web dinámicas

El tema de los robots asesinos que se vuelven en contra de sus creadores y esclavizan a la humanidad, luego de que esta los explotara y los tratara como simples máquinas desechables, es uno de los temas más explotados en el mundo de la ciencia ficción. "Yo, Robot" es sólo la más nueva de las películas sobre el tema, pero hasta The Matrix se centra en este asunto (vean Animatrix; la disfruté mucho más que a las secuelas de los hermanos Wachonski).



Pero no vine a hablar de cine ni de novelas de Asimov. Aunque sí sobre aquello de la explotación de las máquinas.

Ayer fueron las elecciones regionales en Venezuela. La página de RNV, como lo esperaba, sufrió una carga de tráfico bastante alta, y lamentablemente no aguantó. Normalmente recibe unos 120 visitantes simultáneos, pero este domingo a eso de las 10 u 11 de la noche, cuando todo el mundo ingresaba a un lado u otro buscando información sobre quienes eran los candidatos ganadores, los contadores subieron a 400 personas o más.

El problema se centró en el servidor de base de datos MySQL. Voy a tratar de explicar más o menos cómo funciona la página de RNV para que quienes no sepan nada de computación entiendan qué pasó.

Una página web de noticias típica, como Globovisión, Unión Radio o RNV, guarda las noticias en una computadora que llamaremos "servidor de base de datos", que es una especie de gran gavetero o archivador donde se almacenan y clasifican las noticias y fotos.

Hay otro computador, llamado el "servidor de aplicación", que tiene un software que toma esas noticias y fotos, las saca de las gavetas, y con unas instrucciones especiales que son dadas por un programador (¡yooooo! *suenan aplausos*) se construye la página web en lenguaje HTML, que es la que usted ve en su computador.

Ahora bien, fíjense: cuando a uno le enseñan a programar, le enseñan a hacer que, por cada usuario que entre a la página, hay que ir gaveta por gaveta buscando las noticias, construir la página y mandarla al usuario, y repetir eso cada vez que entre otro usuario. Es decir, si entran 8 mil usuarios, se reconstruye la página 8 mil veces aún si ésta no ha cambiado en nada.

Lo lógico sería construir la página una sóla vez, guardarla en un lugar que llamaremos caché, y darle una copia de esa página a cada usuario, hasta que se haga necesario reconstruirla, lo cual generalmente no pasa mucho.

Comprensible, a uno le enseñan a hacer las cosas como en el primer método, porque es la manera más fácil. Es la forma adecuada de aprender a programar en la web.

La rebelión de mi robot
Sin embargo, si el servidor de aplicación pensara y tuviera sentimientos, seguramente se amotinaría y daría un golpe de Estado contra su programador en cuestión de minutos. ¿Por qué? Porque le estoy haciendo repetir una misma tarea cientos o miles de veces cuando podría hacerla una sola vez para todo el mundo.



Es como querer escribir un panfleto y dárselo a 5 mil personas, pero en vez de escribirlo y sacarle 5 mil fotocopias, más bien le ordene a mi secretaria escribir los 5 mil panfletos a mano teniendo una fotocopiadora disponible.

Cuando los usuarios que quieren ver la página son pocos, no hay mayores problemas porque el servidor de aplicación es fuerte y hace sus tareas repetitivas sin quejarse y sin pensar en cómo hacerlas mejor. Pero cuando son muchos los usuarios, como me pasó ayer, el servidor pierde demasiado tiempo repitiendo estúpidamente las cosas por cada visitante... pierde el tiempo que podría usar atendiendo a todos los usuarios nuevos que vienen.

Claro, el servidor hace esas cosas estúpidamente porque yo se lo ordené, así que en realidad el estúpido soy yo. Y eso lo entendí el domingo a las 10 de la noche, cuando vi por el cliente de MySQL que el servidor estaba colapsado procesando una lenta consulta 40 veces al mismo tiempo, cuyo resultado sólo cambia cuando un reportero añade una nueva noticia. ¿Por qué más bien no guardo el resultado de esa consulta en alguna parte y regenero la consulta cada vez que un periodista añada una noticia en RNV? Eso significaría que esa consulta se generaría 50 veces al día como máximo, y no cada vez que alguno de los 15 mil visitantes diarios de la página quieran ver su portada.

Total, en dos horas, en medio de las elecciones regionales y mientras parte del país esperaba los resultados (y otra parte aún mayor dormía plácidamente), implementé en PHP+MySQL una caché para que el pobre servidor no tenga que repetir 4000 veces algo que puede hacer una sóla vez.

No descubrí la América (Colón tampoco). Cosas como esa la habíamos discutido y planeado cuando trabajaba en InfoGuía o en Aporrea, pero nunca había implementado una más que todo por flojera y porque no había tenido la necesidad.

Además, los servidores de aplicación todavía no son máquinas quejumbrosas como nosotros los humanos. Si así fuera, si a cada rato un servidor me fastidiara diciéndome "epa Luigino, ¿cuándo vas a programarme la caché para que yo no tenga que trabajar tanto?", créanme que hubiera programado mi primera caché en 1997 cuando comencé a programar la página web dinámica de www.InfoGuia.net

O peor aún, ya todas las páginas web que he hecho se hubieran sublevado y hubieran hecho un macabro plan para conquistar el mundo y esclavizar a los programadores.
Publicar un comentario