debug_mode=ON

Buscar en

 
 

Introducción a Google App Engine

Escrito por gimenete hace 1 años bajo una licencia de Creative Commons Creative Commons License
3400 visitas. Etiquetas: python, gae, google, app-engine

Google App Engine es un servicio de Google relativamente nuevo y que en el momento de escribir este artículo está todavía en versión Beta.

Es un servicio para la creación de aplicaciones web escalables. Pretende convertir el cloud computing en una commodity. Es decir, ofrece hospedaje a aplicaciones web para que los programadores no nos tengamos que preocupar de contratar más o menos servidores, configurar firewalls, switchs, replicación, backups,...

Este servicio compite directamente con Amazon en el fondo, pero en la forma tienen bastantes diferencias.

  • Google App Engine ofrece un entorno completamente integrado. Esto da una facilidad enorme, pero también como veremos muchas limitaciones.
  • Empezar a utilizar Google App Engine es gratuito. Es gratuito para los primeros 500Mb de almacenamiento y CPU y ancho de banda suficiente para servir aproximadamente 5 millones de páginas vistas al mes. Si se require más cuota se ofrecerán unas tarifas muy competitivas. Esas tarifas son aproximaciones de las tarifas que habrá una vez que el servicio deje de estar en pruebas.
  • Es fácil de escalar. La asbtracción en Google App Engine es completa. No debes preocuparte del número de servidores, de las configuraciones,... De todo eso se encarga Google. Sin embargo el proceso en Amazon es bastante más costoso: eres tú quién debe arrancar o parar servidores, configurar bases de datos, IPs,...

En conclusión Amazon ofrece mayor libertad a cambio de una mayor complejidad. Entremos ahora en los detalles de Google App Engine.

Qué ofrece Google App Engine

  • Un entorno de desarrollo y unas APIs.
  • Subdominios en appspot.com. Tu aplicación en principio se situará en http://example.appspot.com pero puedes asociarla a un dominio que te pertenezca.

El entorno de desarrollo (SDK)

El kit de desarrollo apenas ocupa 10Mb instalado. Contiene principalmente dos aplicaciones: un script para arrancar el servidor de desarrollo y otro script para desplegar la aplicación.

Aquí muestro los comandos básicos:

Arrancar el servidor de desarrollo

dev_appserver.py directorio_aplicacion

Arrancar el servidor de desarrollo borrando el contenido del datastore (luego veremos qué es).

dev_appserver.py --clear_datastore directorio_aplicacion

Desplegar la aplicación para que esté disponible en nuestro subdominio.

appcfg.py update directorio_aplicacion

Por el momento las aplicaciones para Google App Engine se programan en Python. Sin embargo es muy probable que los ingenieros de Google estén trabajando en soportar otros lenguajes: Ruby, PHP, Java,... Y se sabe que un ingeniero de Google ya está trabajando en el soporte para Perl. Por el momento sólo está soportado Python y sólo podremos usar librerías que sean 100% Python.

Django

Por defecto GAE viene con una versión reducida de django 0.96. Es de esperar que en próximas versiones del entorno de desarrollo se incorpore ya la versión 1.0 de django como versión por defecto.

El Datastore

App Engine ofrece un API de persistencia. Se trata del API datastore. El datastore permite definir clases cuyas instancias sean persistentes. Para ello basta crear una clase que extienda de db.Model. Ejemplo:

from google.appengine.ext import db

class Pet(db.Model):
  name = db.StringProperty(required=True)
  creation_date = db.DateTimeProperty(auto_now_add=True)

Para insertar un nuevo Pet en la base de datos basta crearlo y llamar al método put(). Así de sencillo.

pet = Pet(name='Arturo')
pet.put()

Los objetos persistentes tienen una clave. Dicha clave se puede obtener con el método key(). En una plantilla django podríamos hacer lo siguiente:

<a href="/pet.edit?key={{ pet.key }}">editar mascota</a>

Y en el controlador podríamos hacer lo siguiente:

pet = Pet.get(self.request.get('key'))

Una clave (key) tiene el siguiente aspecto: 'agZzZWl2aXRyDwsSCERhdGFiYXNlGI8BDA'. Es una versión ofuscada de la clave. Pero la clave realmente es un objeto Key que tiene dos campos. Si queremos utilizar el identificador numérico que "está oculto" podemos utilizar:

<a href="/pet.edit?id={{ pet.key.id }}">editar mascota</a>

Y recuperar el objeto con:

pet = Pet.get_by_id(int(self.request.get('id')))

Para hacer consultas hay dos caminos. Simplemente voy a poner un par de ejemplos.

pets = Pet.all().filter('name', 'Arturo').order('-creation_date')

Esta consulta obtiene todas las mascotas que se llamen 'Arturo' y las ordena inversamente por fecha de creación. Esta consulta también la podemos hacer utilizando GQL, un lenguaje similar en sintaxis a SQL.

pets = Pet.gql('WHERE name=:1 ORDER BY creation_date DESC', 'Arturo')

El API datastore tiene diversas limitaciones:

  • Hay limitaciones en las consultas que se pueden hacer. Concretamente no se pueden utilizar operadores de desigualdad (<, <=, >, >=) en más de un campo.
  • El datastore no es una base de datos relacional. No se pueden hacer JOINs porque estos no son escalables.
  • Se pueden crear relaciones entre entidades, pero eliminar un extremo de la relación no elimina el otro. Es decir, si tuviéramos una clase 'Person' y decidiéramos que cada mascota pertenece a una persona, al borrar una persona no se borrarían las mascotas. Esto es así también por motivos de escalabilidad.
  • Soporte para FULL TEXT. Es sorprendente que Google no soporte esto todavía, pero la realidad es que buscar texto en la base de datos está muy limitado. Hay que utilizar funcionalidades no documentadas y con importantes carencias. En este otro artículo explico cómo utilizar FULL TEXT en Google App Engine.

Usuarios

Google App Engine ofrece un API de autenticación que funciona con las cuentas de GMail / iGoogle. También podemos hacer que este API funcione con nuestro dominio de Google Apps. Es decir, podemos autenticar a nuestros usuarios xxx@example.com con muy poco esfuerzo. Este ejemplo es muy ilustrativo (sacado de la documentación):

from google.appengine.api import users

class MyHandler(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()
    if user:
      greeting = ("Welcome, %s! (<a href=\"%s\">sign out</a>)" %
                  (user.nickname(), users.create_logout_url("/")))
    else:
      greeting = ("<a href=\"%s\">Sign in or register</a>." %
                  users.create_login_url("/"))

    self.response.out.write("<html><body>%s</body></html>" % greeting)

Envío de emails

GAE también nos ofrece un API de envío de mails. La cantidad de emails que se pueden enviar al día está limitada al igual que el ancho de banda, CPU, etc. Actualmente hay una limitación de 2000 emails diarios.

Este es un ejemplo de cómo se envían emails con esta API (sacado de la documentación):

from google.appengine.api import mail

mail.send_mail(sender="support@example.com",
              to="Albert Johnson <Albert.Johnson@example.com>",
              subject="Your account has been approved",
              body="""
Dear Albert:

Your example.com account has been approved.  You can now visit http://www.example.com/  and sign in using your Google Account to
access new features.

Please let us know if you have any questions.

The example.com Team
""")

Un detalle importante a tener en cuenta es que el campo sender debe ser el email de un administrador o del usuario actual (el devuelto por users.getcurrentuser()).

Memcache

Para disminuir el uso de disco y CPU es muy importante cachear las consultas del datastore. También por supuesto se pueden cachear otros datos o trozos de texto. Por ejemplo puede resultar útil cachear fragmentos de HTML que varíen poco en el tiempo y que sean complejos de procesar. Un ejemplo claro es una "nube de etiquetas".

La caché actúa como un diccionario/mapa/array asociativo. Se guardan y obtienen objetos a partir de una clave y se les puede asignar una "fecha de caducidad".

Manipulación de imágenes

El API de manipulación de imágenes es muy sencilla de utilizar. Tiene funciones para rotar, recortar, reflejar y redimensionar imágenes. Una importante carencia es que no hay forma de escalar imágenes sin deformarlas. No obstante aquí tenéis un artículo que explica cómo escalar imágenes sin deformarlas.

URL Fetch

El entorno de desarrollo está muy limitado para evitar excesos en el uso de recursos y asegurar la escalabilidad. Así por ejemplo no hay soporte para acceder al sistema de ficheros, sockets,... Sin embargo sí que se provee con un API de alto nivel para hacer llamadas HTTP que usaremos si por ejemplo nuestra aplicación necesita consumir información de web services. Este API se denomina URL Fetch.

La consola de administración

Por cada aplicación tendremos una consola de administración muy completa que nos permitirá hacer seguimiento de diversas métricas de nuestra aplicación: peticiones por segundo, errores por segundo, cantidad de datos enviados y recibidos,... Este es un ejemplo de un gráfico:

Estadísticas peticiones

Y aquí podéis ver más funcionalidades de la consola de administración.

La consola de administración también permite hacer un seguimiento de los logs de la aplicación y desde ella también podremos invitar a otros desarrolladores para que tengan acceso a la misma y para que puedan desplegar la aplicación.

Finalmente también permite consultar los datos almacenados en el datastore.

En local, en el entorno de desarrollo, tendremos una consola de administración reducida en la que sólo podremos hacer dos cosas: gestionar la información del datastore y ejecutar código arbitrario en una consola interactiva. La consola interactiva es útil para probar porciones de código. Nótese que la consola interactiva no está disponible en producción.

Carencias

  • Google App Engine no tiene un API de sesiones. En algunos nos bastará combinar el API de usuarios, el API de memcache y el datastore. Pero si por ejemplo queremos tener nuestras propias cuentas de usuarios, entonces, sí necesitamos un API de sesiones. Pues bien, hay quien ya se ha encargado de ayudarnos en esto. Se trata del proyecto gae-utilities..
  • Hay poca información y herramientas para exportar o importar grandes volúmenes de datos de la base de datos. Hay un artículo sobre cómo importar datos desde un archivo CSV, pero poco más.
  • No hay tareas programables. Se pueden utilizar servicios como webcron.org para paliar esta carencia, pero no son la mejor solución. Actualización: Google App Engine ya soporta tareas programadas.

Conclusiones

Google App Engine es un proyecto muy ambicioso que todavía tiene importantes limitaciones. Es de esperar que Google le dedique grandes esfuerzos y que pronto obtengamos noticias de importantes mejoras. GAE promete mucho y de momento es buena elección si las necesidades de tu proyecto no chocan con las limitaciones del servicio.

 

¡Votalo! 7 votos
¡Compártelo!

        

&nbps;

&nbps;

gimenete

Sobre gimenete

Gimenete es un tipo al que le encanta programar. Lleva media vida programando en Java, y ahora le da bastante también a Python. No le hace ascos a JavaScript. Su tema de investigación favorito ahora es el cloud computing.

 
Regístrate o haz login para participar.
¿Todavía no conoces debugmodeon?
debugmodeon es la red social para profesionales de la informática
descubre debugmodeon
 

2 comentarios en "Introducción a Google App Engine"

Davemm
Davemm escribió
hace 1 años

#1   

Bastante interesante amigo ...

Saludos.

 

wilfre
wilfre escribió
hace 1 años

#2   

Gracias por el articulo,aun no programo python bien(un hola mundo y una calcu xD)pero se ve que para los desarolladores python es muy buena.aun ni se me pasa por la cabeza como crear una web con python...

Saludos!

 
 
 
 

© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |