Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Scaling Spree's API
Search
Ryan Bigg
February 27, 2014
Programming
0
170
Scaling Spree's API
Ryan Bigg
February 27, 2014
Tweet
Share
More Decks by Ryan Bigg
See All by Ryan Bigg
Hiring Juniors - RubyConf Indonesia 2019 Closing Keynote
radar
1
320
Web Directions - Code Leaders - Hiring Juniors
radar
0
410
The Future of Rails - Take 2
radar
0
90
The Future of Rails
radar
1
94
Exploding Rails
radar
9
1.7k
Hiring Juniors
radar
2
390
The Perfect Coding Test
radar
0
100
Your First Developer Job
radar
1
98
Hiring Juniors
radar
2
260
Other Decks in Programming
See All in Programming
ServerAction で Progressive Enhancement はどこまで頑張れるか? / progressive-enhancement-with-server-action
takefumiyoshii
6
520
Amazon Aurora Serverless v2が意外と高かった話と、AWS Database Migration Serviceの話
satoshi256kbyte
1
110
The Cutting Edge Of Versioning (LambdaConf 2024)
chriskrycho
0
250
Runtime Objects in Rust
mitsuhiko
0
220
RubyGems on ruby.wasm
kateinoigakukun
0
130
RustでAWS Lambda functionをいい感じに書く
taiki45
2
150
Using "modern" Ruby to build a better, faster Homebrew
mikemcquaid
2
280
Dev ContainersとTestcontainers
bells17
3
100
The test code generator using static analysis and LLM
mikik0
1
200
Balkan Ruby 2024 — How and why to run SQLite on Rails in production
fractaledmind
0
110
Documentation testsの恩恵 / Documentation testing benefits
ssssota
1
560
“Seeing Like a Programmer”—Resiliency, Limits, and Moral Hazards in Software Engineering (LambdaConf 2024)
chriskrycho
0
430
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
56
9.3k
Creatively Recalculating Your Daily Design Routine
revolveconf
211
11k
10 Git Anti Patterns You Should be Aware of
lemiorhan
649
58k
The Invisible Customer
myddelton
114
12k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
15
1.6k
Optimizing for Happiness
mojombo
370
69k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
51k
Designing the Hi-DPI Web
ddemaree
276
33k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.7k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
41
4.5k
Rails Girls Zürich Keynote
gr2m
91
13k
A Modern Web Designer's Workflow
chriscoyier
689
190k
Transcript
Scaling Spree
None
Rendered spree/api/products/index.v1.rabl ! in 1760.2ms
! cache @product api/app/views/spree/api/products/show.v1.rabl
Rendered spree/api/products/index.v1.rabl ! in 79.7ms 22x faster!
None
DO: 2GB Droplet (SFO) Apache Bench (ab) Benchmarker
DO: 2GB Droplet (NYC) Spree: master stock nginx + puma
Test Server
requests=1000, concurrency=50! ! Requests per second: 11.38
requests=10000,! concurrency=500! ! Requests per second: N/A! Load average: 26.14!
DO: 4GB droplet! ! Requests per second: N/A! Total of
33 requests completed!
nginx sez:! ”512 worker_connections not enough"
! *Google for "nginx worker_connections"* ! ! events {! worker_connections
19000;! }! ! worker_rlimit_nofile 20000;
! requests=1000, concurrency=500! ! Requests per second: 39.84 3.5x faster!!
Percentage of the requests served within a certain time (ms)!
50% 6379! …! 75% 10297! …! 100% 25090 (longest request)
Percentage of the requests served within a certain time (ms)!
50% 6379! …! 75% 10297! …! 100% 25090 (longest request)
1 [|||||||||||||||||||||||||||||||||||||100.0%] 2 [|||||||||||||||||||||||||||||||||||||100.0%]
DO: 32GB droplet, 12 cores!
39 req/s x 6?! 2 cores => 12 cores! ~10x
faster?!
! requests=1000, concurrency=500! ! Requests per second: 58.84 [#/sec] (mean)
5.2x faster!!
! expires_in 3.minutes api/app/controllers/spree/products_controller.rb
None
! requests=1000, concurrency=500! ! Requests per second: 529.19 [#/sec] (mean)
48x faster!!
None
! requests=1000, concurrency=500! ! Requests per second: ! 1705.49 155x
faster!!
! requests=10000, concurrency=1000! ! Requests per second: ! 1859 169x
faster!!
CACHE EXPIRY?! !1
None
Purge everything Purge by key Purge by URL
Purging by key headers[‘Surrogate-Key’] = “product_id=1” headers[‘Surrogate-Key’] =! “product_id=1 taxon_id=1
taxon_id=2”! !
Purging URLs /api/products! ! /products/ruby-on-rails-tote