O’Clock, el startup de social countdowns que descansa sobre Google App Engine
jueves, 29 de enero de 2015
Cuando O’Clock comenzó a aparecer en prensa, nos dimos cuenta que:
- El rendimiento no era óptimo.
- La experiencia de un usuario en Europa era distinta a la de un usuario en Latinoamérica.
O’Clock es una plataforma de cuentas regresivas sociales que nos ayuda a recordar los momentos importantes de la vida. Solo basta acceder al sitio www.oclck.com o descargar la App, programar una cuenta regresiva social (o seguir una existente) y comenzar a interactuar con nuestros amigos (y/o desconocidos) para compartir esa ansiada espera.
Los relojes están organizados en la plataforma por ubicación (mediante geolocalización) o tendencias y se pueden acelerar y/o compartir por redes sociales o incrustarlos en otros sitios web. Hasta el momento hemos recibido el reconocimiento de múltiples organizaciones, entre los que destacan Angelhack, AppCampus, AppMyCity, IncubaUC, AppCircus y desde hace pocos días, formamos parte del programa Startup Launch.
La plataforma web ha sido construida en Python (algunos procesos con Django y otros sin framework para agilizar los tiempos de respuesta), el motor DB para datos persistentes es MySQL, la App fue desarrollada de forma nativa con Android SDK, y utilizamos algunos servicios externos mediantes APIs como Mandrill y PubNub entre otros, para concentrar nuestro foco en el producto.
Sin embargo, el servicio más importante que utilizamos y que nos ha permitido escalar tranquilos es Google App Engine. Los peaks de uso de O’Clock ocurren en la proximidad de fechas emotivas (San Valentín, Navidad, año nuevo, etc...), y utilizar esta plataforma como servicio nos permite descansar en problemas de escalamiento, sin estar despiertos a las 2 de la mañana por un peak de usuarios.
El apoyo de los Google Developer Experts ha sido vital
Cuando O’Clock comenzó a aparecer en prensa, nos dimos cuenta que:
- El rendimiento no era óptimo.
- La experiencia de un usuario en Europa era distinta a la de un usuario en Latinoamérica.
Y si bien intentamos prescindir de Django (framework) para agilizar algunos procesos, nos dimos cuenta que no era suficiente, y fue entonces cuando tocamos la puerta (o más bien el Hangout) de los Google Developer Experts Hernan Liendo (Argentina) y David Cifuentes (Colombia), quienes no solo nos ayudaron a resolver algunas dudas específicas, sino que también nos dieron los siguientes consejos que tuvieron gran impacto en el rendimiento y experiencia:
- Cambiar de Blobstore a Cloud Storage para el almacenamiento de imágenes: Mejoramos el rendimiento, obteniendo el máximo potencial de la infraestructura y distribuyendo las imágenes para que los usuarios que descarguen el contenido lo hagan desde un punto cercano (y por lo tanto, más rápido).
- Pasar de SQL a GAE Datastore: Con esta medida hemos podido mejorar la velocidad/rendimiento de la plataforma, considerando algunas cualidades como el manejo de entidades que nos permiten seguir escalando tranquilos.
A continuación les dejamos un pequeño código de como realizamos el upload de las imágenes:
def create_file(filename,fil):
write_retry_params=gcs.RetryParams(backoff_factor=1.1) content_type=mimetypes.guess_type(filename)[0]
with gcs.open(filename,'w',content_type=content_type,options={b'x-goog-acl':b'public- read'}) as f:while True:
chunk=fil.read(8192)
if not chunk: break f.write(chunk)
return 'https://storage.googleapis.com%s'%(filename)
Este método recibe el nombre de la imagen y el contenido de esta como parámetro, dentro del método obtiene el MIME Type ('image/jpeg','image/bmp') del archivo, luego usando la librería cloudstorage, creamos un nuevo archivo usando el modo 'w', pasando además el nombre de la imagen, el tipo de contenido, y la opción para dejar un enlace público a la imagen ('x-goog-acl':'public-read'), luego se lee el contenido de la imagen y se escribe en el nuevo objeto de gcs, y finalmente se retorna la url para acceder a la imagen en GCS.
También pueden utilizar al siguiente función para obtener información del archivo (tamaño, tipo, timestamp y md5 por ejemplo) :
def stat_file(filename):
stat=gcs.stat(filename)
return repr(stat)
Gracias al apoyo de inversionistas ángeles, en 2015 hemos traído nuestra operación a San Francisco (EE.UU), donde esperamos acelerar el desarrollo. Los invitamos a seguir o crear las cuentas regresivas sociales para esas fechas importantes que no quieren dejar pasar.
Este post ha sido creado por Guillermo Díaz, fundador y CEO de O’Clock.