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.
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
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:
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:

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
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.
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.
Davemm escribió
hace 1 años
wilfre escribió
hace 1 años
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? |
#1
Bastante interesante amigo ...
Saludos.