building & testing scalable rails applications

27
Building & Testing Scalable Rails Applications

Upload: evilmike

Post on 09-Jul-2015

1.437 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Building & Testing Scalable Rails Applications

Building & Testing Scalable Rails Applications

Page 2: Building & Testing Scalable Rails Applications

Mike Smith

• Technical Lead - Blitz.io

• Ruby developer

• @evilmike

Page 3: Building & Testing Scalable Rails Applications

Building a scalable app

Page 4: Building & Testing Scalable Rails Applications

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

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

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

Speed up your slow requests

Page 8: Building & Testing Scalable Rails Applications

Database Queries

• Identify slow database queries

• Optimize queries & add table indexes

• ActiveRecord::Base.explain (Rails 3.2)

Page 9: Building & Testing Scalable Rails Applications

Rails Caching

• Page Caching

• Action Caching

• Fragment Caching

• Low-level Caching

Page 10: Building & Testing Scalable Rails Applications

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

Free Rails to handle dynamic requests

Page 12: Building & Testing Scalable Rails Applications

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

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

Scale your infrastructure up

Page 15: Building & Testing Scalable Rails Applications

Scale vertically

Page 16: Building & Testing Scalable Rails Applications

Increase the size of your servers

• More memory, More CPU

• Good for Database servers & Caching servers

Page 17: Building & Testing Scalable Rails Applications

Scale horizontally

Page 18: Building & Testing Scalable Rails Applications

Add more servers

• Serve more requests at a time

• Good for Application servers & Background workers

Page 19: Building & Testing Scalable Rails Applications

Two app servers

Nginx+Passenger Nginx+Passenger

HTTP Load Balancer

Page 20: Building & Testing Scalable Rails Applications
Page 21: Building & Testing Scalable Rails Applications

4 Application Server Instances

2 Application Server Instances

Page 22: Building & Testing Scalable Rails Applications

Load testing tips

Page 23: Building & Testing Scalable Rails Applications

Test in a realistic environment

• Use realistic data

• Use an environment that replicates production

Page 24: Building & Testing Scalable Rails Applications

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

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

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

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