Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scaling Spree's API

Ryan Bigg
February 27, 2014

Scaling Spree's API

Ryan Bigg

February 27, 2014
Tweet

More Decks by Ryan Bigg

Other Decks in Programming

Transcript

  1. Scaling Spree

    View Slide

  2. View Slide

  3. Rendered spree/api/products/index.v1.rabl !
    in 1760.2ms

    View Slide

  4. !
    cache @product
    api/app/views/spree/api/products/show.v1.rabl

    View Slide

  5. Rendered spree/api/products/index.v1.rabl !
    in 79.7ms
    22x faster!

    View Slide

  6. View Slide

  7. DO: 2GB Droplet (SFO)
    Apache Bench (ab)
    Benchmarker

    View Slide

  8. DO: 2GB Droplet (NYC)
    Spree: master
    stock nginx + puma
    Test Server

    View Slide

  9. requests=1000,
    concurrency=50!
    !
    Requests per second:
    11.38

    View Slide

  10. requests=10000,!
    concurrency=500!
    !
    Requests per second: N/A!
    Load average: 26.14!

    View Slide

  11. DO: 4GB droplet!
    !
    Requests per second: N/A!
    Total of 33 requests completed!

    View Slide

  12. nginx sez:!
    ”512 worker_connections not enough"

    View Slide

  13. !
    *Google for "nginx worker_connections"* !
    !
    events {!
    worker_connections 19000;!
    }!
    !
    worker_rlimit_nofile 20000;

    View Slide

  14. !
    requests=1000, concurrency=500!
    !
    Requests per second: 39.84
    3.5x faster!!

    View Slide

  15. Percentage of the requests served within a
    certain time (ms)!
    50% 6379!
    …!
    75% 10297!
    …!
    100% 25090 (longest request)

    View Slide

  16. Percentage of the requests served within a certain
    time (ms)!
    50% 6379!
    …!
    75% 10297!
    …!
    100% 25090 (longest request)

    View Slide

  17. 1 [|||||||||||||||||||||||||||||||||||||100.0%]
    2 [|||||||||||||||||||||||||||||||||||||100.0%]

    View Slide

  18. DO: 32GB
    droplet, 12 cores!

    View Slide

  19. 39 req/s x 6?!
    2 cores => 12 cores!
    ~10x faster?!

    View Slide

  20. !
    requests=1000, concurrency=500!
    !
    Requests per second: 58.84 [#/sec]
    (mean)
    5.2x faster!!

    View Slide

  21. !
    expires_in 3.minutes
    api/app/controllers/spree/products_controller.rb

    View Slide

  22. View Slide

  23. !
    requests=1000, concurrency=500!
    !
    Requests per second: 529.19 [#/sec]
    (mean)
    48x faster!!

    View Slide

  24. View Slide

  25. !
    requests=1000, concurrency=500!
    !
    Requests per second: !
    1705.49
    155x faster!!

    View Slide

  26. !
    requests=10000, concurrency=1000!
    !
    Requests per second: !
    1859
    169x faster!!

    View Slide

  27. CACHE
    EXPIRY?!
    !1

    View Slide

  28. View Slide

  29. Purge everything
    Purge by key
    Purge by URL

    View Slide

  30. Purging by key
    headers[‘Surrogate-Key’] = “product_id=1”
    headers[‘Surrogate-Key’] =!
    “product_id=1 taxon_id=1 taxon_id=2”!
    !

    View Slide

  31. Purging URLs
    /api/products!
    !
    /products/ruby-on-rails-tote

    View Slide