02 / CONSUME A TOKEN SAME OBJECTS / NEW POSITIONS
A is admitted. Its token moves out of the available budget and into the spent-token history.
ARRIVING IN THIS BURST
Arrival order is illustrative.ADMITTED / HISTORY
Admission is not completion.REJECTED / NOT QUEUED
ADMISSION BUDGET
1 token / request
3 - 1 = 2. Admission spends budget immediately.
ADMITTED 1 / REJECTED 0The small numbered dots beside admitted requests record tokens already spent.
03 / ABSORB THE BURST BURST CAPACITY IS NOT A PER-SECOND COUNT
B and C use the remaining tokens. The bucket is empty before the next clock tick.
ARRIVING IN THIS BURST
Arrival order is illustrative.ADMITTED / HISTORY
Admission is not completion.REJECTED / NOT QUEUED
ADMISSION BUDGET
1 token / request
2 - 2 = 0. The initial burst consumed the stored budget.
ADMITTED 3 / REJECTED 0A refill rate of one token per second can still allow an initial burst of three.
04 / ENFORCE THE BOUNDARY EMPTY BUCKET / NO WAITING QUEUE
D cannot be admitted. This example returns HTTP 429 and tells the client when to try again.
ARRIVING IN THIS BURST
The client may retry later.ADMITTED / HISTORY
Admission is not completion.REJECTED / NOT QUEUED
ADMISSION BUDGET
1 token / request
429 Too Many RequestsRetry-After: 1 · illustrative response
0 TOKENS. Rejecting D does not spend a token.
ADMITTED 3 / REJECTED 1429 and Retry-After are policy choices here, not universal defaults for every rate limiter.
05 / ADVANCE THE CLOCK REFILL IS TIME-DRIVEN
One second passes. A new token appears, and the client sends a new attempt: D2.
NEW ARRIVAL / CLIENT RETRY
D2 is a new attempt.ADMITTED / HISTORY
Admission is not completion.REJECTED / NOT QUEUED
ADMISSION BUDGET
1 token / request
429 Too Many RequestsEarlier response to D, not a waiting request
0 + 1 = 1. Request completion did not refill this bucket.
ADMITTED 3 / REJECTED 1A rate limit budgets admission over time. It does not directly limit concurrent in-flight work.
06 / RECHECK ADMISSION A RETRY NEEDS ITS OWN TOKEN
D2 is admitted this time. The original rejected attempt is still part of the history.
NO NEW ARRIVALS
D2 was checked again.ADMITTED / HISTORY
Admission is not completion.REJECTED / NOT QUEUED
ADMISSION BUDGET
1 token / request
429 Too Many RequestsEarlier response to D, not a waiting request
1 - 1 = 0. Four admissions used three initial tokens plus one refill.
ADMITTED 4 / REJECTED 1There are no competing arrivals in this example. Production retries still need backoff and careful policy handling.
07 / RESPECT THE CAP BURST BUDGET / LONG-RUN REFILL
After several quiet seconds, the bucket is full again. Additional refill is discarded at the capacity limit.
NO NEW ARRIVALS
No requests arriveADMITTED / HISTORY
Admission is not completion.REJECTED / NOT QUEUED
ADMISSION BUDGET
1 token / request
429 Too Many RequestsEarlier response to D, not a waiting request
MIN(3, 0 + 4) = 3. The cap bounds the next burst.
ADMITTED 4 / REJECTED 1Sources: Token-bucket semantics · HTTP 429 · Native Marp morphing
This is a provider-neutral token-bucket illustration, not a running rate limiter. Policy: start with 3 tokens, refill 1 token at each whole-second tick, cap at 3, charge 1 token per admitted attempt, and do not queue rejected requests. All zero-second frames describe ordering within one burst before the first refill. The admitted lane is a history of admission decisions, not concurrent execution. The tokens drawn beside admitted requests are spent-token bookkeeping, not permits returned on completion. HTTP 429 and Retry-After are explicit example choices. Stable data-morph names identify the same requests and tokens on successive pages. There is no custom JavaScript, timer, or in-slide CSS animation in this deck. Sources: https://learn.microsoft.com/aspnet/core/performance/rate-limit#token-bucket-limiter https://www.rfc-editor.org/rfc/rfc6585.html#section-4
Advancing one slide moves request A and token 1 through Marp's native morph. The token is spent at admission; this frame makes no claim about whether A's handler has started or finished. B, C, and D still await their admission decision within the same illustrated burst, not in a configured server-side waiting queue.
Two admission decisions are grouped into this keyframe so B/C and their tokens morph together. Each admission still costs one token. This is not a claim that the limiter performs one atomic two-request operation. Token bucket permits an initial burst from saved capacity; its refill rate is not the same as a fixed-window maximum of one request in every second.
RFC 6585 defines HTTP 429 for rate limiting and permits a Retry-After header. This example chooses a one-second delay because the next refill is at t=1. A real application must configure its response and calculate meaningful retry metadata; other implementations may queue, return a different status, or drop. Nothing about a Retry-After header guarantees success: another request may spend the newly available token first. D was rejected, not retained for later execution.
At t=1 exactly one periodic refill has occurred. Token 4 is new; tokens 1-3 stay in spent history so the visual does not imply they were returned by completed work. D2 is a new client attempt after waiting, not D being dequeued by the server. Other arrivals and timer jitter are omitted. A real retry may still be rejected. Concurrency limiters replenish permits on completion; token buckets replenish over time. That is the distinction this frame is meant to make visible.
This keyframe shows the favorable retry outcome for a quiet system. The client waited for the next refill and then submitted a new request. The admission check is performed again; the prior rejection does not reserve a future token. No claim is made that every real retry succeeds or that 429 handling is universal.
After the retry at t=1 the balance is zero. Ticks at t=2, 3, and 4 add tokens 5, 6, and 7. The t=5 refill cannot take the balance above 3 and is discarded. The admitted-history lane remains unchanged: elapsed time is not evidence that those requests have completed, and completion is not what replenishes the bucket. This deck has only complete authored snapshots. Going backward rewinds the explanation, not a real service. PDF/no-JS output contains all seven states. The animation method uses stable view-transition-name values, one unique name per object per slide. Marp supplies all transitions; no custom runtime is included.