![Page 1: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/1.jpg)
Building & Testing Scalable Rails Applications
![Page 2: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/2.jpg)
Mike Smith
• Technical Lead - Blitz.io
• Ruby developer
• @evilmike
![Page 3: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/3.jpg)
Building a scalable app
![Page 4: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/4.jpg)
A typical Rails stack
• Passenger forwards HTTP requests
• Rails processes generate responses
• Database is shared by all Rails processes
Nginx+Passenger
![Page 5: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/5.jpg)
Rails concurrency
• Multiple Rails worker processes per server
• # of processes is limited by available memory
• Each Rails process handles one request at a time
![Page 6: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/6.jpg)
Key Concept!
• There’s a finite number of requests that can be handled concurrently
• Additional requests wait until the next Rails process becomes available
![Page 7: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/7.jpg)
Speed up your slow requests
![Page 8: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/8.jpg)
Database Queries
• Identify slow database queries
• Optimize queries & add table indexes
• ActiveRecord::Base.explain (Rails 3.2)
![Page 9: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/9.jpg)
Rails Caching
• Page Caching
• Action Caching
• Fragment Caching
• Low-level Caching
![Page 10: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/10.jpg)
Long-running Tasks
• Don’t execute long-running tasks in the request handler
• Use background workers
Resque, Delayed Job
![Page 11: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/11.jpg)
Free Rails to handle dynamic requests
![Page 12: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/12.jpg)
Static Content
• Serve with Nginx, Apache, etc.
• CSS, Images & Javascript
• User-uploaded & generated files (S3, etc)
• Consider using a CDN
![Page 13: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/13.jpg)
HTTP Caching
• Caching layer in front of your Rails process
• Varnish & Rack::Cache
• Expiration model• Expires: Fri, 28 Sep 2012 01:12:32 GMT
• Validation model (Conditional GET)• Last-Modified: Wed, 29 Aug 2012 04:58:08 GMT
• ETag: ae7d971f0
![Page 14: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/14.jpg)
Scale your infrastructure up
![Page 15: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/15.jpg)
Scale vertically
![Page 16: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/16.jpg)
Increase the size of your servers
• More memory, More CPU
• Good for Database servers & Caching servers
![Page 17: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/17.jpg)
Scale horizontally
![Page 18: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/18.jpg)
Add more servers
• Serve more requests at a time
• Good for Application servers & Background workers
![Page 19: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/19.jpg)
Two app servers
Nginx+Passenger Nginx+Passenger
HTTP Load Balancer
![Page 20: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/20.jpg)
![Page 21: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/21.jpg)
4 Application Server Instances
2 Application Server Instances
![Page 22: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/22.jpg)
Load testing tips
![Page 23: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/23.jpg)
Test in a realistic environment
• Use realistic data
• Use an environment that replicates production
![Page 24: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/24.jpg)
Consider your location
• Latency can affect load test results
• Consider running your load test from the region where most of your users originate
![Page 25: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/25.jpg)
Consider the effects of caching
• To test worst-case performance, you may need to bust some caches
• Vary the URL or query parameters
GET /blog/article_1GET /blog/article_2GET /blog/article_3
...
![Page 26: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/26.jpg)
Pay attention to request headers
• Emulate the HTTP headers of your expected clients
•Accept-Encoding: gzip, deflate
• Accept: */*
• User-Agent:
![Page 27: Building & Testing Scalable Rails Applications](https://reader034.vdocument.in/reader034/viewer/2022052316/559e033a1a28ab266a8b473f/html5/thumbnails/27.jpg)
Try
• Sign up & test with 250 virtual users for free
• Engine Yard Cloud users
• http://cloud.engineyard.com/addons/blitz
• Or signup directly
• http://blitz.io