Sergio's Blog

TweetMix

March 04, 2011

Hagamos un recuento desordenado de TweetMix. La idea se me ocurrió hace un par de semanas: coger un “chat-bot“, alimentarlo con los tweets de un usuario y ponerlo a decir bobadas. El chat-bot que usé fue escrito en perl y funciona al estilo de mega-hal, un viejo chat-bot con el que Alejo, Javier y yo jugabamos hace ya mas de diez años, cuando el internet todavía tenía gracia. Si quieren documentarse al respecto pueden buscar por cadenas de Markov. Hice una primera implementación en alrededor de una hora, usando bash, el API sin autenticación de twitter y unas cuantas herramientas de linea de comando de unix (curl, recode, cut, etc). La idea resulto buena y al cabo de un par de horas ya cerca de 150 personas le estaban sacando incongruencias a sus cerebros artificiales.

Twitter solo permite un numero limitado de hits por hora, lo que se convirtió en el primer obstaculo para que más gente usara el sitio. Muy rápido, la aplicación estaba llegando al limite en cada intervalo, así que tuve que apagarla. Decidí hacer una implementación que superara esta limitación para de paso jugar con las técnicas asociadas. Escribí entonces una nueva implementacion en lisp, usando una librería de oauth. En pocas palabras, esto permite acceder a twitter a nombre de cada usuario, multiplicando así el limite de hits por hora por el número de usuarios. Como no hay nada complicado en el programa, en unos dias de trabajo muy esporadico saque una nueva version, que volvió a tener bastante exito.

El siguiente obstaculo fue hacer el programa suficientemente robusto para soportar la alta demanda. El problema aqui era que obtener los datos de twitter y transformarlos y procesarlos es un proceso que toma tiempo y que se realiza en un proceso aparte, un llamado a perl. Esto hacia que el servidor web de lisp despachara demasiados hilos, lo que estaba terminando mal. Aplicamos entonces dos ideas. La primera fue idea de fidel: en vez de generar una frase por cada request, generar bastantes de un solo golpe e irlos consumiendo poco a poco. Así disminuimos drasticamente el número de procesos a lanzar por cada carga de la página. Comenzamos a usar redis para guardar los mixs en vez de tenerlos en el espacio de memoria del servidor web. La segunda idea fue extraer del servidor web el proceso de obtención y procesamiento de los tweets de cada usuario. Asi, cuando un usuario nuevo llega, el servidor web pone en una cola el nombre del usuario y uno (o varios) proceso aparte va tratando los diferentes nombres de la cola. Aprovechamos el redis para implementar la cola de demandas. De esa manera mantenemos bajo control el número de procesos y liberamos al servidor web de los problemas asociados con ese tratamiento. El código de tratamiento de tweets lo re-escribió Fidel en Perl. Algo que hay que notar es que los llamados a twitter fallan muy muy frecuentemente. La alta frecuencia de este tipo de problemas (los errores al llamar a un servicio exterior) es una de las dificultades particulares que enfrenta el programador en la red.

En paralelo, Juan Diego hizo un excelente diseño que es el que usamos actualmente.

Luego de un estallido de popularidad inicial, las visitas han bajado bastante, pero el uso sigue siendo importante. A la gente le gusta. Creo que puede volverse mas popular aún.

Viendo por encima, es un programa muy muy sencillo, pero que de cierta manera ilustra bien el tipo de estrategia que se puede usar en sitios de alto tráfico. Cosas cheveres que se descubrieron: redis y oauth. Igualmente he podido jugar con los amazon web-services, que me parecen bastante prácticos y muy bien implementados, pero ligeramente caros (sobre todo el costo en ancho de banda de S3).


Written by Sergio G.