Cross-Server Synchronization

Networking

Real-time cluster synchronization via Roblox MessagingService for instantaneous network-wide bans.

# The Cross-Server Banning Challenge

In large Roblox games with dozens or hundreds of concurrent server instances, an exploiter banned in Server A might immediately rejoin Server B if the system relies solely on asynchronous DataStore polling.

RAC solves this by implementing Distributed Messaging Synchronization using native Roblox MessagingService.

[Server 1: Admin executes PermBan]
                 │
                 ├─► 1. Writes BanRecord to DataStoreService (Permanent)
                 │
                 └─► 2. Publishes to MessagingService topic "RAC_CrossServer_Ban"
                                      │
                 ┌────────────────────┴────────────────────┐
                 ▼                                         ▼
   [Server 2: Subscribed Listener]           [Server 3: Subscribed Listener]
   - Checks if target player is online       - Checks if target player is online
   - If online: player:Kick(...)             - If online: player:Kick(...)
   - Updates local activeBans memory cache   - Updates local activeBans memory cache

# Subscribed Topics (Constants.TOPICS)

PunishmentManager.Init() registers two global communication channels:

# 1. CROSS_SERVER_BAN ("RAC_CrossServer_Ban")

When a ban is published:

  • Every active game server receives the Types.PunishmentRecord payload.
  • The server checks if Players:GetPlayerByUserId(record.userId) is currently present.
  • If present, the target is immediately kicked:
    targetPlayer:Kick(string.format(
        "\n[RAC Security Enforcement]\nYou have been banned: %s\nAppeal at: %s", 
        record.reason, 
        appealUrl
    ))
    
  • The record is added to the server's in-memory activeBans table to reject any rejoin attempts during that server's lifetime.

# 2. CROSS_SERVER_UNBAN ("RAC_CrossServer_Unban")

When an administrator revokes a ban or accepts an appeal:

  • An unban event containing userId is published.
  • All game servers purge activeBans[userId], immediately allowing the player to enter game instances without waiting for server restarts.

# Performance & Latency

Across Roblox's global data center network, MessagingService ban propagation typically executes in $<50\text{ms}$. An exploiter cannot escape to another server before the ban is registered cluster-wide.


# Next Steps