José Galisteo Ruiz

¯\_(ツ)_/¯

Heroku y Memcached local

| Comments

La única opción “oficial” para usar memcaché en Heroku es usar el addon Memcachier o algún otro servicio externo, lo cual está genial pero a veces no es lo mejor, todo dependerá de nuestra aplicación y la estrategia de caching que usemos.

En mi caso quiero usar memcached para cachear partes de vistas basándome en el updated_at de los objetos, una estrategia super sencilla. Además en los listados puedo hacer desde 10 hasta cientos de peticiones a Memcached pues son caches de fragmentos anidados.

El problema aquí está en la latencia, por poca que sea, multiplica eso por 100 o 500 peticiones. Lo ideal para mi caso sería tener Memcached corriendo en la misma maquina que mi aplicación.

Como ejecutar Memcached local en Heroku dynos

Añade https://github.com/Americastestkitchen/heroku-buildpack-apt a tu app. Puedes hacerlo desde consola o la interfaz de Heroku.

1
$ heroku buildpacks:add https://github.com/Americastestkitchen/heroku-buildpack-apt

Crea un fichero Aptfile con los paquetes a instalar, en este caso solo Memcached.

1
2
3
# Aptfile

memcached

Cambia tu Procfile para que ejecute memcached y tu aplicación, en mi caso hice:

1
2
3
4
# Procfile
web: memcached -m 64 & bundle exec puma -C config/puma.rb

# -m es la cantidad de ram

Con esto cuando vuelvas a desplegar tendrás disponible memcached en cada dyno dedicado a web. Los parametros son los que vienen por defecto 127.0.0.1:11211.

Cosas a tener en cuenta:

La cantitdad de RAM disponible

Puedes usar log-runtime-metrics para monitorizarlo o las estadisticas que ofrece Heroku en el dashboard, pero estas solo están disponibles para aplicaciones que usan dynos a partir de standar-1x. Necesitas saber cuánta RAM consume tu app normalmente, cosa que puedes ver con NewRelic (gratis) y decidir que cantidad le dedicas a Memcached.

Una instancia de Memcached por dyno

Esto es lo que buscábamos al fin y al cabo, si quieres memcached para tus workers tendrás que hacer lo mismo que para web. Si tienes varios dynos corriendo cada uno tendrá su propia caché, por lo que tu aplicación debe estar preparada para ello. Si necesitas una sola instancía de Memcached entonces lo mejor es que uses un servicio externo.

Volatilidad

Cada vez que despliegues y posiblemente cada vez que hagas un restart perderás toda la caché. Por esta razón no es buena idea hacer lo mismo para Redis, a menos que uses Redis única y exclusivamente para caché.

Las pruebas

Por último una muestra de mis logs antes y después.

Comments