Arañando segundos: Cachés y números primos

09.06.2009 12

Cuando te dedicas a crear sitios web que van a soportar tráficos de cientos de miles de usuarios únicos al mes con millones de impactos durante esos periodos, cualquier parte de la aplicación en el que consigas reducir milisegundos redundará en un mejor aprovechamiento de la infraestructura y por tanto en una reducción de los costes de la misma, al ser capaz de incrementar el número de peticiones por segundo que puede atender tu servidor. Hoy vamos a hablar de una técnica ya usada en otros ámbitos pero que pocas veces la he visto utilizada en desarrollos web, y es el uso de números primos en la expiración de las cachés.

A la hora de identificar las cachés que conforman una página, nos podemos encontrar con dos tipos distintos de caché:

  • Permantentes: No tienen tiempo de expiración. Normalmente o no son borradas o en caso de ser borradas se realiza desde código (por ejemplo, al añadir un nuevo artículo borramos la caché que contiene el listado de los últimos n artículos).
  • Temporales: Tienen tiempo de expiración. Dentro de este tipo de caché entran aquellos módulos que no merece la pena borrar desde código, como por ejemplo datos que muestres en la cabecera o el pie que con que se refresquen cada x minutos es más que suficiente.

Dentro de los cachés temporales es frecuente encontrarse con módulos que expiran transcurrida la misma cantidad de tiempo (2 horas), o módulos que expiran transcurrida una fracción del tiempo de los módulos más tardíos (10 minutos). En un caso que tuviésemos 4 módulos que caducan a las 2 horas y 3 módulos que caducan a los 10 minutos nos encontraríamos con que realmente cada 2 horas tenemos que estar regenerando 7 módulos.

Una manera de evitar una frecuencia tan alta de regenerar todos los módulos de caché es utilizar algo tan sencillo como números primos de minutos en vez de tiempos más “redondos”. En el caso que comentábamos antes cada dos horas se producía la regeneración ya que el mínimo común múltiplo de 10 (2 x 5) y 120 (2^3 x 3 x 5) es 120 (2^3 x 3 x 5). Sin embargo, si para los 3 módulos que caducaban a los 10 minutos hubiésemos escogido los números primos que rodean a 10 (7, 11 y 13) y para los 4 módulos que caducan a las dos horas hubiésemos escogido los primos que rodean a 120 (109, 113, 127, 131), nos encontraríamos con que nunca (o más estrictamente, cada 7 x 11 x 13 x 109 x 113 x 127 x 131 = 205.122.846.929 minutos) tendríamos que regenerar las 7 cachés a la vez, y no solo eso, sino que la gran mayoría de tiempo estaríamos sirviendo o de caché todo o como mucho regenerando un módulo o dos a la vez. Al fin y al cabo, los datos seguirían siendo aproximadamente igual de actuales que si tuvieran los valores más “redondos”.

Esto mismo que hemos explicado para cachés temporales se podría aprovechar para transformar cachés permanentes en temporales. Solo habría que cambiar la escala de “minutos” a “segundos”, y tendríamos datos tan en tiempo real como un usuario se podría dar cuenta ;) Y con estos pequeños cambios simplificaríamos de gran manera nuestros controladores, algo que a su vez implica que reducimos la cantidad de errores posibles en nuestro código y a la postre reducción también en el coste de mantenimiento del mismo :)

Respuestas a “Arañando segundos: Cachés y números primos”

Enlazan a esta entrada

  1. Reflexiones e irreflexiones

Envía tu comentario