even faster django

43
Even Faster Django Mongodb + Jinja2 + Bigpipe Gage Tseng / GenieCapital [email protected]

Upload: gage-tseng

Post on 02-Nov-2014

1.932 views

Category:

Technology


0 download

DESCRIPTION

Even Faster Django shared at PyCon Taiwan 2012.

TRANSCRIPT

Page 1: Even faster django

Even Faster DjangoMongodb + Jinja2 + Bigpipe

Gage Tseng / [email protected]

Page 2: Even faster django

About GageYahoo! F2E Intern

TechCrunch Hackathon 北京

Start my Python life

2008

2009

2010

2011

2012

Genie Capital

Master of CS NTU

PYCON

Gulu.com

Page 3: Even faster django
Page 4: Even faster django

Web Framework

Easy Quick

Page 5: Even faster django

Performance ? Hmm.... it is OK

Page 6: Even faster django

Fast ?How to make it

Page 7: Even faster django

Fast ?What is

Page 8: Even faster django

Fast is about User Experience

and Response Time

Page 9: Even faster django

http://fast.example.com GO

1 2

Page 10: Even faster django

http://crazy.fast.example.com GO

0.1

Page 11: Even faster django

It is almost

Impossible

Page 12: Even faster django

We are talking aboutlarge scale and dynamic web site

Page 13: Even faster django

Definition of FastPage start to render in 1 second

Show important content in 2 seconds

Page 14: Even faster django

Request and Response

Web Server

HTTP Request

DNS Lookup Data Transfer

DB

Data Transfer

Response

Parse HTMLDownload CSS, JS

DB Query

Render Response

Render and Execute JS

Page 15: Even faster django

50%Database &Template Engine

Page 16: Even faster django

Database Good Query Performance

High Scalability

Easy to Use

Page 17: Even faster django

High Scalability

NoSQL Database

BSONJavascript

Schema Free

Page 18: Even faster django

Django-Nonrel

Django Mongodb Engine

Page 19: Even faster django

Migration-Free

$ python manage.py migrateNo more South

Page 20: Even faster django

Embedded ModelLess Query and lookupclass UserProfile(models.Model):

contact = EmbeddedModelField('ContactModel')...

> print my_profile.contact.phone> u"0919xxxxxx"

Page 21: Even faster django

SetField / ListFiled / DictField

Easy to use & Query Fastclass UserProfile(models.Model):

skill = ListField(models.CharField(max_length=24))...

> print my_profile.skill

> UserProfile.objects.filter(skill="python")> [u"python", u"javascript", u"erlang"]

> [<UserProfile Gage>, <UserProfile Jason>]

Page 22: Even faster django

Template Engine High Render Speed

Easy to Use

Page 23: Even faster django

Jinja2FastExtensibleDjango template like

Page 24: Even faster django

Jinja2

https://github.com/coffin/coffin

Coffin

Page 25: Even faster django

With Jinja2 You can<h1>{{ user1.get_nickname() }}</h1>

<h1>{{ user1.fun().attr }}</h1>

No more Complicated template tags

Page 26: Even faster django

Benchmark

Page 27: Even faster django

It is faster now

Page 28: Even faster django

http://faster.example.com GO

0.9

Page 29: Even faster django

Even FasterCan it be

Page 30: Even faster django

What is Even FasterPage start to render in 0.5 second

Show important content in 1 second

Page 31: Even faster django

BigPipe !Facebook 2009

Page 32: Even faster django

http://bigpipe.example.com GO

0.2 0.9

Page 33: Even faster django

http://bigpipe.example.com GO

0.2 0.9

Page 34: Even faster django

BigpipeBreak web pages into multiple chunks (Pagelet)

Server render a pagelet and response

Prepare CSS

Render Page (HTML DOM)

Execute JS when JS resources are ready

Page 35: Even faster django

Request and Response

Web Server

HTTP Request

DNS Lookup Data Transfer

DB

Data Transfer

Response

Parse HTMLDownload CSS, JS

DB Query

Render Response

Render and Execute JS

Page 36: Even faster django

Web Server

HTTP Request

DNS Lookup Data Transfer

DB

DB QueryRender and Execute JS

Data Transfer Render Response

Parse HTMLDownload CSS, JS

DB Query

DB Query

Page 37: Even faster django

http://bigpipe.example.com GO

0.2 0.9

Page 38: Even faster django

How fast is it (from facebook)

Page 39: Even faster django

Facebook

BigPipe

Streaming HttpResponsehttps://code.djangoproject.com/ticket/7581

BigPipe Javascripthttps://github.com/msroot/bigpipe/blob/master/bigpipe.js

Page 40: Even faster django

Django Partdef home(request):

def stream_generator():base = render_to_string("base.html")yield base.ljust(4096)yield main_content(request).ljust(4096) #pagelet

yield footer(request).ljust(4096) #pagelet yield "</body></html>"

return HttpResponse(stream_generator(), mimetype='text/html', \ stream_content=True)

main_content and footer will prepare CSS and JS resource for pagelet.

Page 41: Even faster django

<script>bigPipe.onPageletArrive({"html":"...", "css":{...},"js":{...}})

</script>

<!DOCTYPE html><html>

<head><title>I'm BigPipe</title><script type="text/javascript" src="bigpipe.js"></script>

</head><body>

<script>bigPipe.onPageletArrive({"html":"...", "css":{...},"js":{...}})

</script></body>

</html>

yield base.ljust(4096)

yield main_content(request).ljust(4096)

yield footer(request).ljust(4096)

yield "</body></html>"

Page 42: Even faster django

http://bigpipe.example.com GO

0.2 0.9

Page 43: Even faster django

Even Faster DjangoMongoDB + Jinja2 + Bigpipe

Genie Dev Team+