Boot camp 2010_app_engine_101

Preview:

DESCRIPTION

Slides for the talk I gave for the Google I/O 2010 App Engine Bootcamp session. Thanks to everyone who came out

Citation preview

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

Mail

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!