Boot camp 2010_app_engine_101

46
App Engine 101 Ikai Lan May 17th, 2010

description

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

Transcript of Boot camp 2010_app_engine_101

Page 1: Boot camp 2010_app_engine_101

App Engine 101

Ikai LanMay 17th, 2010

Page 2: Boot camp 2010_app_engine_101

AgendaTopics we'll cover

Why App Engine?Traditional web stack scalability

App Engine to the rescue!

Services and APIs

Code previewGuestbook sampleCodelab preview

Page 3: Boot camp 2010_app_engine_101

What is Google App Engine?

Page 4: Boot camp 2010_app_engine_101

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

Page 5: Boot camp 2010_app_engine_101

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)

Page 6: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Database on a separate server

Still not Scalable!

TWO Single Points of Failure

Page 7: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Multiple Web Servers

Now you need Load Balancing

Database is still Single Point of Failure

Page 8: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Round Robin Load Balancing

Register list of IPs with DNS

DNS record is cached with a Time to Live (TTL)

Page 9: Boot camp 2010_app_engine_101

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

Page 10: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Master Slave Database

:-) Better read throughput :-( Master is SPOF for writes

:-( Master may die before replication

Page 11: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Partitioned Database

:-) Better R/W throughput :-( More machines, more management

:-( Re-architect data model

:-( Rewrite queries

Page 12: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Why build it all yourself?

Page 13: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Why not use Google App Engine?

Simple application configuration

No systems administration

No performance tuning

AUTOMATIC SCALING!

Page 14: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

App Engine Developers/Apps

Page 15: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Page 16: Boot camp 2010_app_engine_101

By the numbers

Over 100,000 applications250,000 developersOver 250 million daily pageviews

Page 17: Boot camp 2010_app_engine_101

Underneath the hood

Page 18: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

App Engine Components

Load balancing

Routing

Hosts static content

Separate from programming files

Page 19: Boot camp 2010_app_engine_101

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.

Page 20: Boot camp 2010_app_engine_101

App Engine Services/APIs

Page 21: Boot camp 2010_app_engine_101

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

Page 22: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Memcache

Optimistic caching

Very stable, robust and specialized

Distributed, very fast, in-memory cache

Page 23: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

URL Fetch

HTTP GET/POST to external service

Allows integration with third-party REST APIs

Simple, HTTP communication

Page 24: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Mail

Outbound mail

Inbound mail handling

Attachment processing

Inbound and outbound mail

Page 25: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

XMPP

Incoming and outgoing XMPP

No need to worry about setting up servers

Instant messaging for your application

Page 26: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Task Queue

Background processing infrastructure

Scheduled jobs

Automatic handling of queuing and job polling

Background and scheduled computation

Page 27: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Images

Resize

Crop

Image compositions

Image manipulation

Page 28: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

Blobstore

Upload and distribute large files

Programmatic access to file contents

Heavy lifting for large files

Page 29: Boot camp 2010_app_engine_101

Google Confidential and Proprietary

User Accounts

Google Accounts or OpenID

Administrator management

No need to create user management system

Federated login for your application

Page 30: Boot camp 2010_app_engine_101

Getting started

Page 31: Boot camp 2010_app_engine_101

Getting started with App Engine

Download the SDKhttp://code.google.com/appengine

Register for an Appspot account

https://appengine.google.com

Write code - deploy!

Page 32: Boot camp 2010_app_engine_101

$ 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

Page 33: Boot camp 2010_app_engine_101

app.yaml – main configuration file

index.yaml – automatically generated to index your data

main.py – your main application "controller" code goes here

Project contents

Page 34: Boot camp 2010_app_engine_101

main.py

Page 35: Boot camp 2010_app_engine_101

$ 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

Page 36: Boot camp 2010_app_engine_101

Deploying the applicationSet application identifierRun deploy scriptYou're live!

Page 37: Boot camp 2010_app_engine_101

Modifying app.yaml

application: helloworldversion: 1runtime: pythonapi_version: 1

handlers:- url: .*script: main.py

Page 38: Boot camp 2010_app_engine_101

Running the deploy script

$ appcfg.py update helloworldScanning files on local disk.Initiating update.Email: ...

Page 39: Boot camp 2010_app_engine_101

You're live!

Page 40: Boot camp 2010_app_engine_101

Demo time!

Page 41: Boot camp 2010_app_engine_101

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()

Page 42: Boot camp 2010_app_engine_101

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

Page 43: Boot camp 2010_app_engine_101

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('/')

Page 44: Boot camp 2010_app_engine_101

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> ''')

Page 45: Boot camp 2010_app_engine_101

Live code!

Page 46: Boot camp 2010_app_engine_101

Next steps

Download the SDKhttp://code.google.com/appengine

Register for an Appspot account

https://appengine.google.comAttend the codelab!