In-Spur-ation Area Boot Camp Welcome to New Consultant Boot Camp!
Boot camp 2010_app_engine_101
-
Upload
ikailan -
Category
Technology
-
view
4.692 -
download
0
description
Transcript of Boot camp 2010_app_engine_101
App Engine 101
Ikai LanMay 17th, 2010
AgendaTopics we'll cover
Why App Engine?Traditional web stack scalability
App Engine to the rescue!
Services and APIs
Code previewGuestbook sampleCodelab preview
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!
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 helloworldINFO 2009-03-04 17:51:22,354 __init__.py]
(Can also use the launcher for Windows and OS X)
Local development server
Deploying the applicationSet application identifierRun deploy scriptYou're live!
Modifying app.yaml
application: helloworldversion: 1runtime: pythonapi_version: 1
handlers:- url: .*script: main.py
Running the deploy script
$ appcfg.py update helloworldScanning files on local disk.Initiating update.Email: ...
You're live!
Demo 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()
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> ''')
Live code!
Next steps
Download the SDKhttp://code.google.com/appengine
Register for an Appspot account
https://appengine.google.comAttend the codelab!