2011 june-kuala-lumpur-gtug-hackathon
DESCRIPTION
Slides for my presentation at the GTUG hackathon in Kuala LumTRANSCRIPT
Ikai LanKuala Lumpur, GTUG Hackathon
Twitter: @ikaiJune 18, 2011
Google App Engine
Saturday, June 18, 2011
About the speaker
• Developer Relations at Google based out of San Francisco, CA
• Primarily work in Java and Python nowadays; lots of experience with Ruby, JavaScript, PHP <5.3
• Focus: Cloud products
• Twitter: @ikai
Saturday, June 18, 2011
Agenda
• What is Google App Engine?
• Various features of GAE
• How to get started
• Introduction to Go
• Important tools + some tips
Saturday, June 18, 2011
Infrastructure
Platform
Software
Source: Gartner AADI Summit Dec 2009
Saturday, June 18, 2011
Infrastructure
Platform
Software
Source: Gartner AADI Summit Dec 2009
Saturday, June 18, 2011
Infrastructure
Platform
Software
Source: Gartner AADI Summit Dec 2009
Saturday, June 18, 2011
Infrastructure
Platform
Software
Source: Gartner AADI Summit Dec 2009
Saturday, June 18, 2011
• Easy to build
• Easy to manage
• Easy to scale
Saturday, June 18, 2011
“We wear pagers soyou don’t have to”
Saturday, June 18, 2011
Saturday, June 18, 2011
>130K Apps
>90K Developers
>700M daily pageviews
Saturday, June 18, 2011
SDK & “The Cloud”
Hardware
Networking
Operating system
Application runtime
Java, Python, Go
Static file serving
20
Saturday, June 18, 2011
• Write code locally
• Test, push to Google Servers
• Administer via a web interface - http://appengine.google.com
Development Cycle
Saturday, June 18, 2011
Admin Console
Saturday, June 18, 2011
Duke, the Java mascotCopyright © Sun Microsystems Inc., all rights reserved.Go Gopher
Saturday, June 18, 2011
• Java
• Scala
• JRuby (Ruby)
• Groovy
• Quercus (PHP)
• Rhino (JavaScript)
• Jython (Python)
• Clojure
Duke, the Java mascotCopyright © Sun Microsystems Inc., all rights reserved.
Extended Language support through JVM
Saturday, June 18, 2011
BlobstoreImages
Mail XMPP Task Queue
Memcache Datastore URL Fetch
User Service
Core APIs
Saturday, June 18, 2011
• Strongly consistent, multi-datastore, multi-data center serving solution
• Write once, have your data be available in a highly consistent manner
•No data loss, no datastore outages
High Replication
Saturday, June 18, 2011
Other APIs
• High performance image serving
• App Engine Map Reduce
• Prospective Search API
• Pipeline API
• OAuth provider
Saturday, June 18, 2011
Prospective Search
• Matches a high rate of incoming documents
• 100,000 matches a second
• Think: How might we build something like Google Alerts?
• http://code.google.com/appengine/docs/python/prospectivesearch/
Saturday, June 18, 2011
A basic Python app
• 2 files: app.yaml and main.py
• Easier to use when Python SDK is in your system path
• Start server with dev_appserver.py
• Deploy via appcfg.py
Saturday, June 18, 2011
app.yaml
Saturday, June 18, 2011
main.py
Saturday, June 18, 2011
Getting started with Java
• Servlets API
• Google Plugin for Eclipse will generate a skeleton project: http://code.google.com/eclipse/beta/docs/download.html
Saturday, June 18, 2011
Go: why I like it
• “The next version of C, brought to you by the guys who didn’t bring you C++”
• Modern, type safe compiled language (stdlib includes: json parsing, web server)
• Functions as first class objects
• Concurrency baked in via goroutines and channels
• Very fast compilation times
Saturday, June 18, 2011
Flexible interfaces// This is an interface declarationtype myInterface interface { set(i int)}
// This is a Type declaration. Note that it is a type, not a classtype myType struct { i int }
// This is how we define a function where myType is a receiver// With an instance of myType we can call myType.set(123)func (p *myType) set(i int) { p.i = i }
// Because myType defines a function with the signature set(int i) method, // we can use it anywhere myInterface is accepted!func setToThousand(x myInterface) { myInterface.set(1000)}
Saturday, June 18, 2011
First class functionspackage main import "fmt"
// Make a function that returns a new functionfunc makeAdd(increment int) (counter func(int) int) { return func(v int) int { return v + increment; } }
func main() { fmt.Printf("value of makeAdd(100)(1) is %v\n", makeAdd(100)(1)); fmt.Printf("value of makeAdd(200)(2) is %v\n", makeAdd(200)(2)); }
// Outputs:// value of makeAdd(100)(1) is 101// value of makeAdd(200)(2) is 202
Saturday, June 18, 2011
Goroutines and Channels
package main import ( "fmt" "time")
func doLotsOfWork(until int, ch chan int) { c := 0 for i := 0; i < until; i++ { c += i time.Sleep(1000) } ch <- c }
func main() { ch := make(chan int) // First the work off into the background go doLotsOfWork(5, ch) // Do more work here while we wait for this process to complete // Block until doLotsOfWork sends data back on this channel i := <- ch fmt.Printf("Final value: %v\n", i)}
Saturday, June 18, 2011
It runs on App Engine!
• Currently requires whitelisting
• Experimental status
• Goroutines allow for concurrency within request; concurrent requests coming
• Demo app: http://moustach-io.appspot.com/
• Source: https://code.google.com/p/appengine-go/source/browse/example/
Saturday, June 18, 2011
Mustachio
Saturday, June 18, 2011
General tips
• The datastore is built on top of BigTable. It is non-relational!
• Be aware of limits: 30 second requests, 10 minute tasks queues/cron jobs, whitelisted classes
• Python 2.5 compatible (but can use 2.6 or 2.7 locally)
Saturday, June 18, 2011
Useful Python tools
• Tipfy: http://www.tipfy.org/
• Django non-rel: http://www.allbuttonspressed.com/projects/django-nonrel
• Testbed API: http://code.google.com/appengine/docs/python/tools/localunittesting.html
Saturday, June 18, 2011
Java tips
• Use low-level datastore API or third party API: http://code.google.com/p/objectify-appengine/
• Start with servlets API - will have to do some work to make your favorite framework work. Slim3 is a good GAE specific framework
Saturday, June 18, 2011
Summary
• Hopefully people here are interested in hacking on App Engine
• Java, Python and Go
• Ask me if you have general questions, I will be around all weekend
Saturday, June 18, 2011
Questions?
• Twitter: @ikai
• App Engine: http://code.google.com/appengine
Saturday, June 18, 2011