Broadcast → Rate Limiting

Rate Limiting

Broadcast shares the global TokenBucket. Large volumes of emits within a frame are automatically throttled. Events that exceed the limit are silently dropped — no error is raised.

How it works

Broadcast rate limiting operates per player. When a client's token bucket is exhausted, additional emit calls targeting that player are dropped without an error or callback. The bucket refills automatically at the configured rate.

BehaviourDetail
ScopePer-player token bucket, shared with the main App channel
On exceedSilent drop — the emit is discarded, no error raised
EmitAllEach player's bucket is checked independently
Custom limitsMove high-volume events to a dedicated Port with its own TokenBucket settings

Per-event isolation with Ports

If you need per-event rate limits independent from the main channel, create a Port with its own TokenBucket settings. The Port's bucket is fully isolated — it cannot be drained by main-channel traffic.

-- Dedicated port for high-frequency position events
app:Listen("fx", function(port)
    -- register routes here
end, {
    maxTokens  = 30,
    refillRate = 15,
})

-- Client uses the named port for its Broadcast receives
local fxListener = RoExpress("Listener", "fx")
Silent drops are intentional. Broadcast is designed for high-frequency, lossy-acceptable events. An occasional dropped damage number or position hint is acceptable and preferred over stalling. For events that must arrive, use Push.

Choosing between Broadcast and Push

BroadcastPush
Rate limitedYesNo (server-initiated)
On rate exceedSilent dropNot applicable
Payload cap900 bytesRoblox standard
Delivery guaranteeNoneGuaranteed, ordered

See also

← Broadcast  ·  Fire Methods | Emit / EmitAll / EmitTo  ·  TokenBucket | token bucket internals  ·  Port Settings | per-port bucket configuration  ·  Push | guaranteed delivery without rate limiting