A monolingual backend is a confession that you didn't read the workload. We pick runtimes the way a kitchen picks knives — by the cut they make, not the brand on the handle. Go does I/O. Rust holds the hot path. Elixir handles the fan-out. The boundary between them is a contract, not an accident.
Five axes that matter once a service is on the production rota. Concurrency model is whether the runtime can handle 10k concurrent things gracefully. Cold start is what your CFO pays for at 3am. Type safety is what saves you at the boundary between teams.
Use means first-pick for a new service. Watch means we'll work in it cleanly if you already have it. Rescue means we modernize you off it — we don't add to it.
A real polyglot architecture under load — measured live across the JVN Network. Each runtime owns a contract; together they handle 340k concurrent connections without a single language having to be everything.
A production request as it crosses three runtimes, two datastores, and the event spine. Every hop is bounded, every boundary is a contract, every span ends up in OpenTelemetry.
JVN Network needed a real-time backbone that could carry hundreds of thousands of concurrent participants without buying a stadium of servers. A single-language stack would have either underrun the sockets or overpaid for the math.
We split the architecture along three contracts. Go owns the service plane — catalog, billing, identity, the things that look like CRUD. Rust takes the hot path — JWT signing, video transcode, ranking — anywhere a microsecond per call multiplies into a region. Elixir handles the fan-out — presence, broadcast, the websocket spine that makes 340k connections feel like one room.
The boundary between them is gRPC and a NATS event spine. No service knows what language its neighbour is. A team can rewrite a service overnight; the contract doesn't move.
— Jordan Hammond, founder, 404inc
Bring us your slowest service. We'll tell you whether the runtime is the bottleneck — or whether the boundary is.