01 / THE BUDGET SLIDE KEYFRAMES + NATIVE MORPH

Throttle the burst.

A small bucket absorbs a burst. One token buys admission for one request.

3 token capacity+1 token each second0 waiting slotst = 0 s

ARRIVING IN THIS BURST

Arrival order is illustrative.
This is not a server queue.

ADMITTED / HISTORY

Admission is not completion.

REJECTED / NOT QUEUED

ADMISSION BUDGET

3of 3 available

1 token / request

ArequestARRIVING
BrequestARRIVING
CrequestARRIVING
DrequestARRIVING

START FULL. Four arrivals meet a budget of three.

ADMITTED 0 / REJECTED 0

Use the arrow keys. Each slide is a complete state; the transition supplies the motion.

02 / CONSUME A TOKEN SAME OBJECTS / NEW POSITIONS

One request. One token.

A is admitted. Its token moves out of the available budget and into the spent-token history.

3 token capacity+1 token each second0 waiting slotst = 0 s

ARRIVING IN THIS BURST

Arrival order is illustrative.
This is not a server queue.

ADMITTED / HISTORY

Admission is not completion.

REJECTED / NOT QUEUED

ADMISSION BUDGET

2of 3 available

1 token / request

ArequestADMITTED
BrequestARRIVING
CrequestARRIVING
DrequestARRIVING

3 - 1 = 2. Admission spends budget immediately.

ADMITTED 1 / REJECTED 0

The small numbered dots beside admitted requests record tokens already spent.

03 / ABSORB THE BURST BURST CAPACITY IS NOT A PER-SECOND COUNT

Three tokens. Three admissions.

B and C use the remaining tokens. The bucket is empty before the next clock tick.

3 token capacity+1 token each second0 waiting slotst = 0 s

ARRIVING IN THIS BURST

Arrival order is illustrative.
This is not a server queue.

ADMITTED / HISTORY

Admission is not completion.

REJECTED / NOT QUEUED

ADMISSION BUDGET

0of 3 available

1 token / request

ArequestADMITTED
BrequestADMITTED
CrequestADMITTED
DrequestARRIVING

2 - 2 = 0. The initial burst consumed the stored budget.

ADMITTED 3 / REJECTED 0

A refill rate of one token per second can still allow an initial burst of three.

04 / ENFORCE THE BOUNDARY EMPTY BUCKET / NO WAITING QUEUE

No token? Reject. Don't queue.

D cannot be admitted. This example returns HTTP 429 and tells the client when to try again.

3 token capacity+1 token each second0 waiting slotst = 0 s

ARRIVING IN THIS BURST

The client may retry later.
The server is not holding D.

ADMITTED / HISTORY

Admission is not completion.

REJECTED / NOT QUEUED

ADMISSION BUDGET

0of 3 available

1 token / request

ArequestADMITTED
BrequestADMITTED
CrequestADMITTED
Dfirst attemptREJECTED

429 Too Many RequestsRetry-After: 1 · illustrative response

0 TOKENS. Rejecting D does not spend a token.

ADMITTED 3 / REJECTED 1

429 and Retry-After are policy choices here, not universal defaults for every rate limiter.

05 / ADVANCE THE CLOCK REFILL IS TIME-DRIVEN

The clock creates the next token.

One second passes. A new token appears, and the client sends a new attempt: D2.

3 token capacity+1 token each second0 waiting slotst = 1 s

NEW ARRIVAL / CLIENT RETRY

D2 is a new attempt.
D's earlier rejection remains.

ADMITTED / HISTORY

Admission is not completion.

REJECTED / NOT QUEUED

ADMISSION BUDGET

1of 3 available

1 token / request

ArequestADMITTED
BrequestADMITTED
CrequestADMITTED
Dfirst attemptREJECTED
D2new attemptARRIVING

429 Too Many RequestsEarlier response to D, not a waiting request

0 + 1 = 1. Request completion did not refill this bucket.

ADMITTED 3 / REJECTED 1

A rate limit budgets admission over time. It does not directly limit concurrent in-flight work.

06 / RECHECK ADMISSION A RETRY NEEDS ITS OWN TOKEN

The retry earns the next token.

D2 is admitted this time. The original rejected attempt is still part of the history.

3 token capacity+1 token each second0 waiting slotst = 1 s

NO NEW ARRIVALS

D2 was checked again.
Retries are not exempt.

ADMITTED / HISTORY

Admission is not completion.

REJECTED / NOT QUEUED

ADMISSION BUDGET

0of 3 available

1 token / request

ArequestADMITTED
BrequestADMITTED
CrequestADMITTED
Dfirst attemptREJECTED
D2new attemptADMITTED

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 1

There 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

Idle time never makes an infinite bucket.

After several quiet seconds, the bucket is full again. Additional refill is discarded at the capacity limit.

3 token capacity+1 token each second0 waiting slotst = 5 s

NO NEW ARRIVALS

No requests arrive
during this idle interval.

ADMITTED / HISTORY

Admission is not completion.

REJECTED / NOT QUEUED

ADMISSION BUDGET

3of 3 available

1 token / request

ArequestADMITTED
BrequestADMITTED
CrequestADMITTED
Dfirst attemptREJECTED
D2new attemptADMITTED

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 1

Sources: 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.