19. gigy Socialize
Flexible Scalability
"Although we typically host all our services in-house,
on our own infrastructure, we felt that GAE would be a better fit
for the live chat feature because of its unique traffic pattern, which
is characterized by very low traffic most of the time with very high
bursts during high profile events."
Raviv Pavel, Gigya VP of Research and Development
http://googleappengine.blogspot.com/2010/02/scalability-means-flexibility.html#links
35. 20+ months in review
Apr 2008 Python launch
May 2008 Memcache, Images API
Jul 2008 Logs export
Aug 2008 Batch write/delete
Oct 2008 HTTPS support
Dec 2008 Status dashboard, quota details
Feb 2009 Billing, larger files
Apr 2009 Java launch, DB import, cron support, SDC
May 2009 Key-only queries
Jun 2009 Task queues
Aug 2009 Kindless queries
Sep 2009 XMPP
Oct 2009 Incoming Email
Dec 2009 Blobstore
Feb 2010 Datastore cursors
36. Happy Birthday App Engine!
Two years old as of Wed April 7th!
Vibrant community of over 250k developers
Over 250 million pageviews
http://googleappengine.blogspot.com/2010/04/happy-birthday.html
42. Cursors
# class Person(db.Model): ...
# Start a query for all Person entities.
q = Person.all()
# If the app stored a cursor during a previous request, use it.
last_cursor = memcache.get('person_cursor')
if last_cursor:
q.with_cursor(last_cursor)
# Perform the query to get 100 results.
people = q.fetch(100)
# Store the latest cursor for the next request.
cursor = q.cursor()
memcache.set('person_cursor', cursor)
43. Task queue
# for each user, add a task to send a custom email message
for u in users:
taskqueue.add(url='/work/sendmail',
params=dict(to=u.email, subject='Hello ' + u.name, body='this
is a message!'))
return # finished now, emails will be sent offline using tasks
...
# task handler automatically called for each task created above
class MailWorker(webapp.RequestHandler):
def post(self):
mail.send_mail('from_me@example.com',
self.request.get('to'), self.request.get('subject'),
self.request.get('body'))
44. Cron #1
cron.yaml (in your project root)
cron:
- description: clear memcache
url: /memcache_clear
schedule: every 24 hours
...
# Human-readable schedule format:
# every 5 minutes
# every 12 hours
# 2nd,third mon,wed,thu of march 17:00
# every monday 09:00
# 1st monday of sep,oct,nov 17:00
# every day 00:00
45. Cron #2
...
class ClearMemcache(webapp.RequestHandler):
def get(self):
pre_flush_stats = memcache.get_stats()
memcache.flush_all()
post_flush_stats = memcache.get_stats()
subject = 'Daily memcache flush'
sender = 'somebody@example.com'
recipient = 'interested-people@example.com'
body = ('Hello! The weekly memcache flush succeeded.n')
body += '<3 your friendly neighborhood cron job'
body += 'pre-flush stats %s nn' % str(pre_flush_stats)
body += 'post-flush stats %s' % str(post_flush_stats)
mail.send_mail(sender, recipient, subject, body)
application = webapp.WSGIApplication([('/memcache_clear',
ClearMemcache)], debug=True)
...
46. AppStats
Win a T-shirt
Upload before/after
screenshots and link
them on Twitter before
May 2nd
@app_engine
#coolappstats
51. Nuestra Experiencia con Google App Engine
Aplicaciones empresariales y sitios Web públicos
Runtime Python y Java. ~2 años
Beneficios
Concentrarnos en la funcionalidad NO en el resto
Fácil despliegue instalación
Retos
Base de datos relacional vs. Bigtable
Limitantes y restricciones
52. Fundación Rogelio Salmona
http://obra.fundacionrogeliosalmona.org
Panel de Soporte para
Operadores Google Apps
54. More Info on App Engine:
http://code.google.com/appengine
http://googleappengine.blogspot.com/
http://gae-java-persistence.blogspot.com/
http://bit.ly/gcodelabs
55. One last thing
If you experience any issue during the
appengine signup like not receiving the SMS
http://bit.ly/devfestsms