javisantana.com

Como aguantamos una portada de google

El día que aguantamos una portada de google

Hoy hace un año si hubieses apuntado tu navegador a google.com hubieses visto un link, justo debajo de la caja de búsqueda, que linkaba a una web que hicimos en vizzuality, endangeredlanguages. El hecho de estar un dia en portada de google.com es para estar bien contento, pero todo el proceso que te lleva hasta ahí y aguantar eso no es precisamente un camino de rosas.

No voy a describir los detalles de implementación o los datos de tráfico, lo primero es muy aburrido y de los segundo seguro que hay algún papel que dice que no lo puedo contar.

Cuando comenzamos el proyecto ya había cierta presión adicional, el cliente era google y aunque era el tercer proyecto que hacíamos con ellos siempre acojona un pelín. Mucha gente me pregunta cómo es trabajar con google y siempre respondo lo mismo: no son super hombres, son como tú y como yo, pero están en una empresa de las que molan. Seguramente haya mega-cracks, pero en muchas pequeñas empresas también los hoy (y posiblemente con más mérito). El proyecto era un target muy concreto, lingüistas, así que cuando tome las primeras decisiones me base en aquello, un pequeño proyecto para google que no tendría muchas visitas. Nada apuntaba a que ese sitio tendría millones de usuarios cada hora.

Opté por algo standard, usar python con django (app engine lo soportaba sin tocar mucho) y mysql como base de datos (gooogle lo llama cloud sql). Obviamente teníamos que usar su infraestructura, así que aunque cloud sql estuviese en muy beta, no me tiró para atrás, después de todo mysql es algo bien probado y simplificaba el desarrollo una barbaridad. Total, no necesitabamos escalar, así que el key-value store que tiene google por defecto no tenía mucho sentido para nostros.

El proyecto era el típico web, todo transcurrió con normalidad hasta que un día, unos dos meses antes de la release, nos llega un correo diciendo que posiblemente estaríamos en portada de google. Imaginad hacer una casa para una familia y te venga una familia numerosa a celebrar allí una boda.

Se me pusieron los cojones de corbata, no había cacheado nada, no había pensado en ninguna forma de escalar absolutamente nada, es más, cada petición a la base de datos tenía un overhead de 10ms, imaginaos si cada página renderizada lanzaba 10 queries (ya sabéis que los ORM son la peste)

Esto se unía a que mi experiencia con sitios muy grandes era 0, hace unos años me publicaron en portada de microsiervos y meneame un pequeño mapa y tuve picos de salida de 6mbits… Jajaja.
Tener no tenía ni puta idea pero qué cojones, íbamos a tener otra oportunidad de tener un reto así? 

Dicho así parece bonito y muy craftman, pero las discusiones por correo con la manager fueron para darnos de ostias, los correos a la gente de google pidiendo consejo técnico para tener algo donde agarrarme, los días enteros haciendo pruebas de carga recortando milisegundos fueron un verdadero infierno.

Finalmente opté por aprovechar al máximo lo que teníamos: instancias (aka CPU). Google app engine escala muy muy bien en máquinas, así que traté de usar todo lo posible los servidores frontend, incluso parte de la cache se hacía en cada una de las instancias. Había cache en varios niveles, tanto a nivel de request, a nivel de render HTML, acceso a base de datos… tenía tanta fe en el escalado de máquinas que la búsqueda para ese día la hice indexando todo en memoria y haciendo una búsqueda lineal por todo el índice. Finalmente en una máquina normalita cualquier página se renderizaba en menos de 10ms con un usuario autentificado, bastante decente. Bueno, después de un mes entero dedicado a optimizar tampoco es algo para estar muy orgulloso.

Contra pronostico y a pesar de que la gente de google no confiaba mucho en ello, pasamos todas la pruebas de carga, la revisión de código y la de seguridad.

Llegó el día, todo empezó bien, australia no era especialmente peligrosa. Recuerdo que Diego -el diseñador- me preguntó “pero tu crees que va a aguantar” respondí “ni con una aparición divina”. Increíblemente aguantó sin despeinarse todo el día, solo tuvimos que hacer dos hotfix, uno por un problema de las cachés de la internacionalización y otro por un fallo de seguridad en un endpoint donde se me olvidó comprobar el el token CSRF. Tuvimos que hacer un cambio justo en el momento con más requests por segundo (cuando lo americanos se levantaron) porque el servidor de picasa, donde teníamos las imágenes dejó de responder (os podéis imaginar el choteo).

Aquella semana, justo a los dos días teníamos la release de evolutionoftheweb así que no dio mucho tiempo a saborear el triunfo :). Hay muchas anécdotas que contar, como que casi nos hacemos un DoS nosotros mismos por un bucle infinito en una redirección en blackberry. Pero muchas de ellas solo las podré contar “face to face”, así que si quieres, avisame por twitter, y tomamos una caña, o vino o lo que sea.