vercel-flags-core: jitter ingest retries and batch-wait window, honor Retry-After#371
Open
vincent-derks wants to merge 1 commit intomainfrom
Open
vercel-flags-core: jitter ingest retries and batch-wait window, honor Retry-After#371vincent-derks wants to merge 1 commit intomainfrom
vincent-derks wants to merge 1 commit intomainfrom
Conversation
… Retry-After Replace the deterministic 100/200ms retry schedule with full-jitter exponential backoff, jitter MAX_BATCH_WAIT_MS by ±20% to desynchronize concurrent flushes, honor Retry-After (capped at 5s), and log when a flush exhausts all retries. Helpers extracted to utils/backoff.ts so they can be reused.
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The usage tracker's
/v1/ingestretry path used a deterministic 100/200ms schedule with no jitter, and the 5s batch-wait window was likewise unjittered. Concurrent processes that started at the same moment would all flush together and, when the server returned a non-2xx, retry in lockstep — amplifyingtransient pressure. This PR addresses that and adds basic observability on dropped batches.Changes
delay = random(0, base * 2^(attempt-1)), capped at 5s). Replaces the previousattempt * 100ms schedule.MAX_BATCH_WAIT_MSis now perturbed by ±20% per process so independent processes don't flush at the same wall-clock instant.Retry-Afteron non-2xx responses (delta-seconds and HTTP-date forms), capped at 5s so a misbehaving upstream can't keep the function alive.Test plan
utils/backoff.test.tscovering parsing edge cases,exponential ceiling,
Retry-Afterfloor + cap, custombaseMs/capMs,and the symmetric jitter bounds.
utils/usage-tracker.test.tsfor end-to-endwiring (
Retry-Afterflows into the retry loop, exhaustion log,no-exhaustion log on success).
pnpm --filter @vercel/flags-core test→ 438/438 pass.pnpm --filter @vercel/flags-core type-check→ clean.