Initially delivered at LA RubyConf 2013, this presentation describes how cutting-edge technology helped to triple performance and drastically cut costs in a mobile social game. Juan Pablo Genovese, a Ruby Architect from Altoros Systems Argentina, explains how, despite the extremely tight budget, the customer managed to:
- go from ~450 req/s to ~1300 req/s
- reduce the number of EC2 application servers from four to one
- provide fast and reliable video uploading and processing
- achieve very easy scaling with automation
while maintaining all the functions of the original RoR app.
2. 16 years in Software Development
From S/390 to Android
In love with Ruby since 2006
Working in
@eljuanchosf
Love to dance Tango and play Blues guitar
3. Set of programming components and
standards.
Open up your app to the world.
Integration!
4. Mobile social game (iOS & Android)
Video upload & encoding
JSON API
AWS -> EC2/S3
6. Find a way to cut costs and improve
performance.
Provide a very easy way to scale the new
solution.
Maintain all the RoR application
functionality, focusing on APIs for the mobile
clients.
Tight, TIGHT budget.
8. Asynchronous (non-blocking) web server framework.
Based on EventMachine
Lightweight
Rack API & middleware support
Very simple yet powerful configuration
Fully async processing
Websockets out of the box
No callbacks!!
Low memory footprint (only 65 KB!)
0.3 ms from top -> bottom!
http://postrank-labs.github.com/goliath/
9. Very simple, very fast work queue.
Saves memory (lots of it).
Multiple queues.
Generic interface.
Several Ruby clients to choose from.
Send your Ruby object as a JSON.
Parallel and asynchronous.
Scales VERY easily.
http://kr.github.com/beanstalkd/
10. Ruby implementation of the Reactor Pattern
Highly scalable
Performance optimized
Mature & stable
Eliminates the complexities of threaded network
programming.
Active community
Examples: Thin & Goliath.
11. October 1995 by Douglas Schmidt
AKA Dispatcher or Notifier
Handle requests delivered to an application by one
or more clients.
Single threaded by definition
Separates application logic from the reactor
implementation
Task switching = no multithreading!
17. Latest version has no built-in routing system.
Ilya Grigorik (Goliath’s creator) suggests to
start multiple Goliath servers, each one with
one endpoint and use HAProxy or any reverse
proxy to route the requests.
That’s kind of cumbersome, don’t you think?
18. Routing was done thru convention over
configuration with a little of Ruby’s reflection
abilities mixed with some inheritance:
http://server/api/game/CreateGame was redirected to the
api/game/create_game.rb controller:
class CreateGame < APIController
.
.
.
.
end
19. Goliath: add processes or servers and
configure them in HAProxy.
Couchbase: add servers to the cluster.
Done!
(we used Scalar to automate this, too)
20. From ~450 req/s to ~1300 req/s.
From 4 to 1 EC2 application servers.
Triple performance while reducing costs.
Video upload and processing fast and
reliable: ~250 jobs/s
21. Contact Juan Pablo @eljuanchosf
Contact Altoros Systems http://altoros.com/contact_us.html