10. geoloqi.com
First Hackathon Attempt
Layer in Geoloqi
Updates to MapAttack server
via HTTP REST API
Processing through Geoloqi’s
persistent store
Finished in a weekend
A lot of fun!
15. geoloqi.com
There were some kinks
Used an REST HTTP service for
APNS (worked, but not “real-time”)
Server was getting backed up
(updates were not async)
16. geoloqi.com
MapAttack Server Issues
Blocking IO (requests to Geoloqi API held
everything up)
Lots of concurrent traffic
Events had to be broadcast to all phones/
clients in the game synchronously
19. geoloqi.com
A key-value store, and so much more
A great implementation of PUBLISH/SUBSCRIBE
So simple, you can actually understand it
Very fast and reliable
Robust library support
23. geoloqi.com
HOW WE USE NODE JS
• Phones:
Custom binary protocol over UDP
• Web Browsers:
Web Sockets via Socket.IO
24. geoloqi.com
Socket.IO is awesome
Adapter Pattern for realtime
Web Sockets, Flash, Long Polling!
One interface for everything
Easy to implement: ~100 LOC
26. geoloqi.com
Geoloqi API
ASYNC FTW!
Delayed updates when possible
Messages queues: Beanstalk
Workers pick tasks off the stack
Process data outside of the persistent store
Simpler than AMQP
28. geoloqi.com
MapAttack Server
(or: How to make Ruby ROFLscale)
MRI Ruby has a global interpreter lock
But MRI Ruby does not block on IO
JRuby and Rubinius 2: Native Threads
And it has a reactor pattern, just like Node JS!
29. geoloqi.com
The Reactor Pattern
“The reactor design pattern is a concurrent
programming pattern for handling service
requests delivered concurrently to a service
handler by one or more inputs” - Wikipedia
My simplest description: Takes your blocking IO
operation, shoves it into its own kernel thread
behind the scenes, uses Unix kernel magic to make
it rejoin the reactor queue when it’s ready.
Linux: epoll(4)
BSD: kqueue/kevent
30. geoloqi.com
Blocking IO a UNIVERSAL problem
All programming languages have trouble with it
The Reactor pattern is a tool to resolve it
Most languages have the Reactor pattern!
JavaScript Node.js
Python Twisted
Ruby EventMachine (libem, C)
Java JBoss_Netty
(wait, what? I thought Java had good threading..)
PHP None yet (perhaps ever)
31. geoloqi.com
Sinatra::Synchrony
kyledrake.net/sinatra-synchrony
Implements EventMachine with Fibers
The result: NO CALLBACKS!
< 100 LOC
Only coding change is to use EM libs and fibers
WOW, THAT WAS EASY.
37. geoloqi.com
Examples of doing it wrong
“Let’s rewrite everything to use TrendDB”
Using EC2 for a single-master DB “because it scales”
Buying something from Oracle
“Ruby/PHP/JS is too slow for this, let’s rewrite it in
TrendLang”
Most NoSQL solutions have dark secrets you don’t
know about. Global write locks, single write master, et
cetera
39. geoloqi.com
Real Hardware FTW?
Single master database? Get a real server! Really!
Cloud is only as fast as the fastest available HDD
EBS performance is not great, even in RAID0 stripe
See orion.heroku.com/past/2009/7/29/io_performance_on_ebs
and perfcap.blogspot.com/2011/03/understanding-and-using-amazon-ebs.html
and blog.dt.org/index.php/2010/06/amazon-ec2-io-performance-local-emphemeral-disks-vs-raid0-
striped-ebs-volumes/
and endevver.com/2010/03/cost-analysis-of-an-amazon-ec2-deployment.html
and mysqlperformanceblog.com/2011/02/21/death-match-ebs-versus-ssd-price-performance-and-
qos
and google.com/search?q=heroku+ebs+performance
High end Xeon, 32GB ECC, fast 220GB SSD: ~$2K
40. geoloqi.com
Real Hardware FTW?
The paradigm is diversifying, and the reason is SSD.
Say hello to the Fusion-io ioDrive Octal.
PCIe x16 slot
5.12TB
6.0 GB/s read
4.4 GB/s write
1.19 MILLION IOPS
Cost: $100,000 (plus $10 S&H).
It’s a steal at this price.. but it will get cheaper.