Discord rewrote their stack multiple times.
Not because they got it wrong.
Because they got too big for what they built.
2013 — The starting stack
Elixir for real-time messaging. Python for APIs. Go for microservices. MongoDB for storage. Electron for desktop.
Standard startup choices. Ship fast, figure out the rest later.
2017 — MongoDB had to go
5 million users. MongoDB couldn't keep up.
Switched to Cassandra. 12 nodes. Worked fine.
Until 2022, when those 12 nodes became 177. Maintenance got painful. Costs climbed. They moved to ScyllaDB.
One problem. Nine years. Three databases.
2019 — Elixir wasn't fast enough for everything
Sorting large data sets in Elixir was taking 170ms per operation.
At Discord's scale, that's not acceptable.
They rewrote it in Rust. Dropped to 1ms.
That's it. That's the whole reason.
2020 — Go's garbage collector became the enemy
Discord's Read States service tracks every message you've read. It gets hit every time you open the app, send a message, read one.
Go's garbage collector runs every 2 minutes. No exceptions. When it runs, it scans everything in memory. With millions of users cached, that scan causes latency spikes.
They tried tuning it. Upgraded Go versions multiple times. Nothing worked.
Rewrote it in Rust. Rust has no garbage collector — memory frees immediately when it's no longer needed. No scan. No spike.
Latency went from milliseconds to microseconds.
The pandemic hit that same year. Users jumped to 100 million monthly. The timing of that Rust rewrite wasn't lucky — it was necessary.
What they never changed
Elixir still handles real-time messaging. BEAM VM is built for it — millions of concurrent processes, instant restarts. You don't replace what works.
Python still manages APIs. Electron still runs the desktop. React Native eventually unified iOS and Android after years of separate codebases.
Not everything needs to change.
The pattern behind all of it
Every switch had a specific trigger. A number that crossed a threshold. A metric that tuning couldn't fix.
No switch was made for hype. No switch was made early.
That's the actual lesson. Not which language to use. Not which database is best.
Use what works. Switch when the numbers tell you to. Know why you're switching.
Discord didn't build for 500 million users on day one. They built for today, fixed for tomorrow.
Also published on Medium
Top comments (0)