Tag: Matchmaking

  • Mama, How Would You Design PUBG and Call of Duty?

    Mama, How Would You Design PUBG and Call of Duty?

    One day my nephew asked me:

    Mama, you work on games, right? How would you design Call of Duty and PUBG–kind of games?”

    (In our family I am Mama— uncle.)

    He expected a short answer — maps, guns, graphics, maybe a cool explosion.

    I almost said “it’s complicated.” Then I realized he had asked the right question for an architect not how the game looks, but how the system is arranged so players can find a match, stay in sync, and not melt the servers when a whole country logs in after school.

    So I answered him the way I wish more design conversations started — with a map.

    Not Erangel. Not Verdansk.

    A map of regions, zones, and services.

    This article is that answer. It is not a leak of PUBG’s or Activision’s private blueprints. Those backends are not fully public. It is how PUBG-like battle royale and Call of Duty–like multiplayer systems are typically shaped — the same vocabulary we use when we design high-scale live games: where the player lands, where the match runs, and which services do the work.


    Draw the map before you name a tool.

    LayerPlain meaningDesign rule
    RegionGeography for ping, friends, and often data rules (India, EU, US-East…)Matchmaking pools and “who can play with whom” are usually region-scoped
    ZoneCapacity and failure slice inside a region (AZ / cluster / pod group)A zone can die without killing the whole region; matches drain carefully
    ServiceA job the software must do (matchmaking, dedicated game host, store, anti-cheat)Put each job where latency and ownership demand — not where the slide looks busy

    Mama’s rule: Players don’t talk to “PUBG” or “CoD.” They talk to a region. Matches run in a zone. Work is done by services.

    If you cannot place a component on that map, you are not designing yet. You are collecting logos.

    Naming trap — three different “zones”

    Kids (and engineers) mix these up:

    1. Cloud / infra zone — failure domain and capacity (this article’s “Zone”)

    2. Map / safe zone — the shrinking circle in a battle royale

    3. Interest / AOI zone — which other players and objects your client needs to know about right now

    Same English word. Three layers. Keep them separate or the design review becomes comedy.

    Walk one player from the sofa to the victory screen.

    Here is the journey I walked with him — overlaid on the map.

    1. Launch / login → hits platform services (identity, entitlement). Often multi-region capable, with a home region.

    2. Lobby / party → region-aware presence: you queue with friends who share a sensible ping story.

    3. Matchmaking → region-scoped queues (skill, playlist, fill rules). Output: “here is your match” + where to connect.

    4. Connect to the match → client is steered to a dedicated game host (or relay path) sitting in a zone inside that region.

    5. In match → authoritative simulation ticks; state replication; interest management; voice often match- or region-local.

    6. Match end → results hand off to progression / inventory / battle pass (platform path — not on every bullet).

    7. Side planes (always on) → anti-cheat signals, telemetry, crash reports — async, must not block the tick.

    This is the same shape as systems I have lived with in live gaming

    matchmaking as a door (ask and get placed), then a live channel / dedicated path as the room (stay connected for the session). Different genre. Same map logic.

    What sits where — service placement.

    ServiceTypical place on the mapWhy
    Identity / accountPlatform (multi-region or hub + cache)Shared identity; not every shot
    Store / battle pass / inventoryPlatformMoney and catalog; after or beside the match
    Friends / party / presenceRegion-awareParties hate cross-ocean ping
    MatchmakingRegionPool quality + latency
    Dedicated game servers / match instancesZone inside regionBlast radius; capacity; drain on failure
    Real-time game gateway / relayEdge / regionLow latency into the match
    VoiceMatch- or region-localLatency and moderation scope
    Anti-cheat (client + server signals)Match-local collect → hub aggregateHot path light; intel can be global
    Telemetry / analyticsSide plane → lakeNever block the tick
    Content / config catalogHub + CDNVersioned rules, maps, playlists

    Hot path rule: bullets, movement, and tick authority stay near the player (region / zone). Store, heavy CRM, and batch analytics do not sit on the shot path — same lesson as handing wallet work off a live game loop.

    Same map — different match shape (PUBG-like vs CoD-like)

    I did not crown a winner. Both sit on Region → Zone → Services. The match they host looks different, so the fleet math changes.

    ConcernPUBG-like battle royaleCoD-like multiplayer modes
    Match shapeLarge map, many players, longer sessionSmaller maps, shorter matches, many playlists
    Dedicated fleetFewer, heavier matches per hostHigher match churn; faster spin-up / teardown
    In-match pressureWide map + vehicles + loot; strong AOI neededTighter spaces; higher tick / precision pressure
    Region pressureLaunch and country spikes; fill 80–100 seatsPlaylist and seasonal spikes; many small rooms
    What stays identicalRegion routing, zone isolation, platform vs game split, async side planesSame

    And, not vs: PUBG-kind and CoD-kind games are not rival architectures. They are two workloads on one map.

    Region design — what my nephew already understood as “ping”

    Ping budget decides who can share a match comfortably.

    Party constraints beat “perfect MMR” if the squad cannot hear each other in time.

    Empty lobby risk — a region that is too fine-grained never fills; too coarse and someone plays on 180 ms.

    Data and policy — some player data and commerce prefer staying in-region.

    Spill / overflow— when a region is on fire, you need a written rule (queue, wait, or rare cross-region with honesty about ping).

    Region is a product decision as much as a cloud dropdown.

    Zone design — why we don’t put every match in one basket

    Inside a region, zones exist so that:

    Hardware or AZ failure takes some capacity, not all evening matches

    You can drain live matches (finish or migrate carefully) instead of hard-killing everyone

    You scale dedicated fleets in slices — warm pools, playlist packs, BR vs small-modes packing

    If matchmaking returns a host, that host’s zone is part of the placement decision — not an afterthought for Ops.

    In-match: who owns the truth

    For both genres, the dedicated (or authoritative) simulation owns match truth: positions, damage, win conditions. Clients predict for feel; server corrects for fairness.

    That is the same ownership lesson as a live game table :many concerns in flight (inputs, timers, broadcasts), but one clear writer of shared state beats “a thread per player mutating the pot.” Concurrency is required. Chaos is optional.

    Interest management (AOI) decides what to send whom — critical on a big BR map, still important in tight CoD lanes. That is game zoning, not your cloud zone.

    One contest, a million players” — how scale actually works

    This is the question my nephew asked next: if a big contest has millions of players, do you build one giant server? When people die, do servers shrink? How does one website send everyone to the right place?

    First correction — millions are not one match

    A PUBG-like battle royale match is on the order of 100 players (squads fill seats). A CoD-like mode is often fewer per room.

    A million concurrent players means roughly:

    many regions taking traffic

    huge matchmaking queues

    thousands / tens of thousands of matches in parallel

    each match on a dedicated host (or a packed host running N matches) inside a zone

    So the platform scales by creating many small rooms, not by stuffing a million people into one simulation. One match still has one authoritative world. Parallelism across the system is many matches at once the same idea as many live tables running together.

    Scale up — when the lobby catches fire

    Autoscaling is driven by signals, not vibes:

    SignalWhat scales up
    Login / store spikePlatform pods / gateway capacity
    Queue depth / wait timeMatchmaking workers + dedicated game fleet
    Assigned matches with no free hostWarm pool → cold start more game servers in the zone
    Telemetry / anti-cheat volumeSide-plane consumers (async)

    Typical dedicated-fleet pattern:

    1. Keep a warm pool of ready game hosts per region/zone (already loaded build, waiting).

    2. Matchmaking fills a lobby → allocates a host (or a match slot on a packed host) → returns connection info to clients.

    3. If warm pool is empty and queue is deep → scale out more hosts (VM/container/bare metal — product choice).

    4. Cap scale with max so a bug cannot bankrupt you; spill to “queue longer” rather than infinite machines.

    Platform and matchmaking scale on HTTP/API metrics. The game fleet scales on matches needing a home.

    Scale down — when the game finishes (not when one player dies)

    When a match ends:

    1. Dedicated host writes results → hands off to progression / rewards (platform).

    2. Players disconnect from that match path.

    3. Host is recycled (back to warm pool) or terminated if pool is fat.

    4. Autoscaler watches idle hosts + queue depth → scale in slowly (hysteresis), so a two-minute lull does not thrash.

    Important: when players are eliminated mid-match (“next circle, fewer alive”), you usually do not tear down or resize away the dedicated server. The match is still live until a winner (or draw) is declared. What can drop is work inside the match:

    fewer clients to replicate to

    lighter AOI / bandwidth

    fewer voice peers

    The map safe zone shrinks (game rules). The cloud zone fleet shrinks when matches complete and demand falls — different clocks.

    Eliminated players often return to lobby / spectate / platform that traffic moves back to lobby and platform services, while the match host keeps serving survivors.

    One domain — how everyone reaches the right service

    Players remember one name: `play.example.com` or the game client’s embedded API host. Behind that single domain:

    Client
      → DNS (often geo / latency aware) → regional edge
        → API gateway / load balancer
             ├─ /auth /store /profile     → Platform services
             ├─ /party /presence          → Region-aware social
             ├─ /matchmaking              → Matchmaking
             └─ after “match found”
                  → dedicated host or game gateway
                     (host:port / token / session from matchmaking — not the store URL)

    (host:port / token / session from matchmaking — not the store URL)

    So:

    One public front door (domain + gateway) for lobby and platform.

    Matchmaking is the redirector in product terms— it tells the client which game service/host owns this match.

    In-match traffic often goes straight to the assigned game endpoint (UDP/dedicated), not through the store cluster.

    Sticky cookies / tokens / session tickets bind “this player → this match host” for the life of the session.

    That is the same door then room idea: REST (or similar) to get placed; persistent/realtime path to play.

    What “services change” as the match levels up

    MomentWhat changes
    QueuingMatchmaking + platform busy; game fleet warming
    Match startOne host owns that match; clients leave matchmaking hot path
    Players eliminated / circle shrinksGame rules + AOI load change; dedicated host stays
    Match overHost frees; progression spikes briefly; fleet can scale down
    Contest evening endsQueue collapses → scale in matchmaking and game fleet toward baseline

    Services do not randomly morph mid-bullet. Ownership moves along the journey: platform → matchmaking → dedicated match → platform again. Autoscaling follows which layer is busy, match by match, region by region.

    What not to put on the map’s hot path

    Charging a card on every elimination

    Synchronous “call the data warehouse” mid-fight

    Treating matchmaking REST polls as the game loop

    One global region “because simpler”

    One mega-zone “because Kubernetes”

    Draw the map. Then pick UDP, dedicated hosts, queues, and stores into the boxes — not instead of the boxes.

    Wrapping-Up

    My nephew wanted guns and maps. I gave him regions, zones, and services.

    Region— where the player belongs for ping and pools.

    Zone — where this match’s capacity and failure story live.

    Services— the jobs: platform, matchmaking, dedicated simulation, edge, side planes.

    PUBG-kind and Call of Duty–kind games share that map. They differ in match shape and fleet churn, not in inventing a different physics of distributed systems.

    Mama’s rule: draw the map before you name the tool.

    Mama’s second rule: a million players means many matches and an autoscaler with a warm pool — not one infinite server that shrinks every time someone is eliminated.

    When someone asks how you would “design PUBG or CoD,” start with: Which region? Which zone? Which service owns this moment in the player’s journey? Then ask: What signal scales that service up — and what event lets it scale down?

    One honest caveat: this design is my assumption — a teaching map from how large multiplayer backends are typically shaped, and from patterns I have used in live gaming. It may not be the exact architecture the owners of PUBG or Call of Duty run in production. Their real systems will differ in topology, naming, vendors, and secrets we do not see. Use the map to think; do not treat it as a reverse-engineered blueprint.