Given at Geekend 2014, this is my introduction to scaling web applications for a semi-technical audience.
Oh No, You
Have to Scale!
Hi, I’m Kevin
I build web things,
and help scale them.
Your Server, Right Now
Poor little thing…
It’s all alone, trying to
Just like you.
• As your data grows, query speed decreases.
• As your app grows, it gets more complex.
• As complexity grows, so do the number of
• As trafﬁc grows, all of those problems end up
database hates you.
It will eventually try to
When you least expect
Indexes help keep your “hot” queries fast and allows you to keep your app performing well as your data grows.
What do you index? Anything you query or sort on!
If you query and sort on different columns in a query, they should be in a compound index!
As your data grows, your queries need to get simpler!
Use memcached, varnish, etc. Put a protective wall of cache around your data. Let your database work hard on things other layers can’t do (writes). Let the other layers
Use read secondaries to scale reads.
Most apps are read-heavy. Take advantage of that.
As your app grows, it
Which means more
complexity in the code.
Don’t make your users
pay for complexity!
Users are impatient! Requests should be less than 100ms in most cases!
Push hard things to
Don’t make your users wait for things that are slow! Set up a job queue and do hard things in the background!
Use reporting as example - pre-generate reports instead of making users wait for them and generating them when they’re requested!
Document stores like MongoDB are GREAT for reporting.
Do as little in a
request as possible.
Pre-process things that are diﬃcult to generate or things that aren’t time sensitive.
See if you can get to one query per request! It’s hard, but that should be the goal.
everything you can!
You can cache pieces of your page in memcached or varnish. It’s awesome.
Think in services
Think about every piece of your app as a service. What are the interfaces? What does it require? What happens when it fails? We’ll get to that…
Not everything needs
Use the right tool for the job. Is your data relational? Use a relational database! Want to do search? Don’t do it in your relational database! There are search engines for
Take the time to explore your options - and seek out people who’ve done it before and ask them their opinion.
Be a little paranoid.
It pays to be a little paranoid - if you use an API, what happens when it goes down? How will your app react? Test it and ﬁnd out, and then protect yourself from it. Your
customers don’t care if your app being down is your fault or not - they’ll blame you!
Think a couple steps
Ask yourself: “what will I do when this breaks?” “what are some other ways to do this?”
Think about how things will scale - but don’t get caught up future-prooﬁng things. Your primary job is to get things done. Just keep an eye out for problem spots and ﬁx
them before they stop everything in its tracks.
Use tools like Scout or NewRelic to instrument your app so you can spot trouble areas before they cause outages!
Get away from a single server. Think of your dependencies as services and treat them as external, even if they’re not. It will make it easier to split things up later on.
Think of your app as a
Every layer should be
able to scale
And if they can’t, ﬁnd a
new way to do that job.
Load Balancer Load Balancer
App Server App Server App Server
Database Database Database
Your system should
expand at any layer.
Make more cake!
Invest in operations. Find people who love to keep things working. Hire them. Support them. Love them.
I know, you’re probably sick of this, but really, they’re super important and will only get more important.
Browsers doing more
Start looking at ways to cache data in the browser instead of on the server. Give your users the appearance of performance! Look at local storage for assets, and even
the new built-in database options! Lots of fun stuﬀ going on in browsers now!
(you know, Docker)
Everyone’s talking about Docker - and containers in general - as a way to make virtualization more eﬃcient. Worth keeping an eye on, but feels too early to jump on for
mission-critical stuﬀ where your data is important (great for app servers, bad for database servers).
Everyone wants to
lock you into their box.
Beware vendor lock-in and closed-source solutions! Build everything in your app as an interface or API so you can replace the underlying implementation when you need
Default to open source, even if you start out with a SaaS platform!
Technology-agnostic, easy to read primer on professional software development and how to become an awesome developer - especially the stuﬀ on Orthogonality!
A great place to start when you’re building an app for best practices!
Great set of goals for designing systems.
Today from 2-4!
Play games made by
• [email protected]