what is app engine? o
TRANSCRIPT
What is App Engine?
Ikai LanOSCONJuly 21st, 2010Twitter: @ikai
AgendaTopics we'll cover
Why App Engine?Traditional web stack scalability
App Engine to the rescue!
Services and APIs
Deployment stepsApp Engine and Open SourceQuestions and Next Steps
What is Google App Engine?
Google Confidential and Proprietary
Google App Engine is...
... a way for you to run your web applications on Google’s scalable
infrastructure.
Google’s Data Centers
Google Confidential and Proprietary
Start with... the basic LAMP stack
LAMP:Linux
Apache
MySql
Programming Language(PHP, Python, Perl, etc.)
NOT Scalable
Single Point of Failure (SPOF)
Google Confidential and Proprietary
Database on a separate server
Still not Scalable!
TWO Single Points of Failure
Google Confidential and Proprietary
Multiple Web Servers
Now you need Load Balancing
Database is still Single Point of Failure
Google Confidential and Proprietary
Round Robin Load Balancing
Register list of IPs with DNS
DNS record is cached with a Time to Live (TTL)
Google Confidential and Proprietary
Round Robin Load Balancing
But the TTL takes time to propagate and might not be respected
So if a machine goes down... :-(
And the database is still SPOF
Google Confidential and Proprietary
Master Slave Database
:-) Better read throughput :-( Master is SPOF for writes
:-( Master may die before replication
Google Confidential and Proprietary
Partitioned Database
:-) Better R/W throughput :-( More machines, more management
:-( Re-architect data model
:-( Rewrite queries
Google Confidential and Proprietary
Why build it all yourself?
Google Confidential and Proprietary
Why not use Google App Engine?
Simple application configuration
No systems administration
No performance tuning
AUTOMATIC SCALING!
The Cloud Computing Landscape
IaaS
PaaS
SaaS
Source: Gartner AADI Summit Dec 2009
Google Confidential and Proprietary
App Engine Developers/Apps
Google Confidential and Proprietary
By the numbers
Over 100,000 applications250,000 developersOver 250 million daily pageviews
Underneath the hood
Google Confidential and Proprietary
App Engine Components
Load balancing
Routing
Hosts static content
Separate from programming files
Google Confidential and Proprietary
App Engine Components
Hosts application code
Handles concurrent requests
Enforces isolation for app safety
Maintains statelessness
Multiple Runtimes
Copyright © Sun Microsystems Inc. All rights reserved.
App Engine Services/APIs
Google Confidential and Proprietary
Bigtable - The App Engine datastore
Arbitrary horizontal scaling - scales to “Internet scale”
Replicated and fault tolerant
Parallel processing
Predictable query performance
No deadlocks
Distributed, partitioned datastore
Google Confidential and Proprietary
Memcache
Optimistic caching
Very stable, robust and specialized
Distributed, very fast, in-memory cache
Google Confidential and Proprietary
URL Fetch
HTTP GET/POST to external service
Allows integration with third-party REST APIs
Simple, HTTP communication
Google Confidential and Proprietary
Outbound mail
Inbound mail handling
Attachment processing
Inbound and outbound mail
Google Confidential and Proprietary
XMPP
Incoming and outgoing XMPP
No need to worry about setting up servers
Instant messaging for your application
Google Confidential and Proprietary
Task Queue
Background processing infrastructure
Scheduled jobs
Automatic handling of queuing and job polling
Background and scheduled computation
Google Confidential and Proprietary
Images
Resize
Crop
Image compositions
Image manipulation
Google Confidential and Proprietary
Blobstore
Upload and distribute large files
Programmatic access to file contents
Heavy lifting for large files
Google Confidential and Proprietary
User Accounts
Google Accounts or OpenID
Administrator management
No need to create user management system
Federated login for your application
Getting started
Getting started with App Engine
Download the SDKhttp://code.google.com/appengine
Register for an Appspot account
https://appengine.google.com
Write code - deploy!
$ dev_appserver.py helloworld # run dev svr$ appcfg.py update helloworld # deploy live
Linux, MacOS, etc. command-line:
Windows GUI (also avail for Mac):
Starting a project
app.yaml – main configuration file
index.yaml – automatically generated to index your data
main.py – your main application "controller" code goes here
Project contents
main.py
$ dev_appserver.py helloworld
(Can also use the launcher for Windows and OS X)
Local development server
Deploying the applicationSet application identifierRun deploy scriptYou're live!
main.py: Adding a handlerfrom google.appengine.ext import webappfrom google.appengine.ext.webapp.util import run_wsgi_app
class MainHandler(webapp.RequestHandler): def get(self): self.response.out.write('<h1>Hello world!</h1>') self.response.out.write(''' <form action="/sign" method=post> <input type=text name=content> <br><input type=submit value="Sign Guestbook"> </form> ''')
class GuestBook(webapp.RequestHandler): def post(self): self.response.out.write( '<h2>You wrote:</h2> %s' % self.request.get('content') )
application = webapp.WSGIApplication([ ('/', MainHandler), ('/sign', GuestBook),], debug=True)
# start_wsgi_app etc ...
main.py: Persisting to the datastore
class GuestBook(webapp.RequestHandler): def post(self): greeting = Greeting() greeting.content = self.request.get('content') greeting.put() self.redirect('/')
main.py: Collecting values from the datastore
class MainHandler(webapp.RequestHandler): def get(self): self.response.out.write('Hello world!') self.response.out.write('<h1>My GuestBook</h1><ol>') greetings = Greeting.all() for greeting in greetings: self.response.out.write('<li> %s' % greeting.content) self.response.out.write(''' </ol><hr> <form action="/sign" method=post> <textarea name=content rows=3 cols=60></textarea> <br><input type=submit value="Sign Guestbook"> </form> ''')
Running the deploy script
$ appcfg.py update helloworldScanning files on local disk.Initiating update.Email: ...
You're live!
Google App Engine and Open Source
Google Confidential and Proprietary
TyphoonAE: Open Source implementation
Google Confidential and Proprietary
Open Source JVM language runtimes
ClojurePractical Lisp on the JVMJRuby/MirahRuby on the JVM. Mirah = Ruby-like language that compiles to Java (speed!)GroovyDynamically typed Java-like languageScalaStrongly typed, functional imperativeJythonJava implementation of Python
Google Confidential and Proprietary
Open Source Persistence Frameworks
Objectifyhttp://code.google.com/p/objectify-appengine/Twighttp://code.google.com/p/twig-persist/Slim3 (popular in Japan)http://sites.google.com/site/slim3appengine/SimpleDShttp://code.google.com/p/simpleds/Django-nonrelhttp://www.allbuttonspressed.com/projects/django-nonrel
Google Confidential and Proprietary
Official features
Datanucleus JDO/JPAhttp://code.google.com/p/datanucleus-appengine/App Engine Map/Reducehttp://code.google.com/p/appengine-mapreduce/Python SDKJava SDK - soon!
Questions and Next Steps
Code time!
main.py: Skeleton application
from google.appengine.ext import webappfrom google.appengine.ext.webapp import util
class MainHandler(webapp.RequestHandler): def get(self): self.response.out.write('Hello world!')
def main(): application = webapp.WSGIApplication([('/', MainHandler)], debug=True) util.run_wsgi_app(application)
if __name__ == '__main__': main()
Next steps
Download the SDKhttp://code.google.com/appengine
Do the codelabhttp://code.google.com/appengine
Register for an Appspot account
https://appengine.google.com
Get this presentation
http://slideshare.net/ikailan