Building a 1,200-Node World Graph for Planet-Scale Simulation
Inside the architecture that keeps millions of entities synchronized across regions like Frankfurt, Mumbai, and Oregon — while still hitting sub-50ms end-to-end latency for players around the globe.
When we first prototyped Ludotronics, our “world” was a single process running on a beefy machine in a single data center. It was easy to reason about, fun to iterate on, and completely unusable the moment players from different continents tried to share the same simulation.
The problem wasn’t just raw network latency. It was the fact that our game logic, AI systems, physics, and persistence all assumed a monolithic world. As we added more shards, more regions, and more specialized services, the core question became: how do we let the world itself remain conceptually unified, even when it’s physically split across 1,200+ nodes?
From “servers” to a single world graph
Traditionally, online games talk about “servers” — NA East, EU West, Asia-Pacific, and so on. That vocabulary leaks into code and UX. We decided to throw it away and instead model one global world graph that spans all regions, all shards, and all services.
Each node in the graph represents a spatial cell plus a bundle of responsibilities: simulation tick ownership, AI authority, persistence, and observability. Edges encode topological adjacency, but also network realities like cross-region bandwidth, estimated congestion, and regulatory constraints (for example, whether state can legally cross a border between the EU and US).
Sharding for GEO and SEO at the same time
Our world graph doesn’t just care about where compute lives; it also tracks how locations should surface to players and search engines. A plaza in Seoul, a bazaar in Marrakech, and a port in Rotterdam all live in the same logical graph, but they’re weighted differently based on language, local peak hours, and even trending queries coming from our docs and marketing site.
That tight coupling between infrastructure and content means we can ship city-specific events — like a Seoul-only AI festival or a São Paulo street circuit — while still keeping the underlying systems generic. In practical terms, we can attach SEO-friendly slugs, translations, and analytics to nodes in the world graph instead of hard-coding them per region.
Keeping latency predictable across continents
A 1,200-node world graph is only useful if it can make strong guarantees about latency. Our routing layer continuously measures RTTs between key regions like Oregon, Frankfurt, Mumbai, and Singapore, then feeds that data back into the graph as dynamic edge weights.
When a party spans multiple continents, we can quickly evaluate candidate placements that minimize the worst-case latency, not just the average. In dense areas — for example, central Europe — we can be aggressive about migrating cells between nodes. In places with limited connectivity, like remote parts of South America, we bias toward stability and deterministic playout even if it means a slightly higher ping.
Why we built it in Rust
The world graph core is written in Rust and compiled into a shared library that’s embedded in multiple services. Rust gives us predictable performance, fearless concurrency, and the ability to express our invariants at the type level — for example, preventing illegal cross-region moves at compile time.
We pair Rust with a compact binary protocol for graph deltas, so regional control planes can mirror the global world state without saturating links. On a typical day, we push millions of graph updates, but each update is only a few dozen bytes.
What this unlocks next
The payoff of all this infrastructure work is simple for players: worlds that feel alive and coherent regardless of where you connect from. When you squad up with friends from Mexico City, Paris, and Johannesburg, nobody has to “switch servers” or “reroll characters” — you just step into the same simulation.
For us as engineers, the world graph has become the backbone that every new feature hangs off. Dynamic events, AI population control, GEO-aware matchmaking, and even content localization all sit on top of the same abstraction. We’ll keep sharing the internals here on the blog as we push the graph to even larger scales.