diff --git a/server/providers/aircraft/enrichment.js b/server/providers/aircraft/enrichment.js index 9b7c1b1bb..4c069fa7f 100644 --- a/server/providers/aircraft/enrichment.js +++ b/server/providers/aircraft/enrichment.js @@ -7,8 +7,9 @@ const ADSBDB_MAX_RESPONSE_BYTES = 1024 * 1024; /** * adsbdb.com enrichment proxy: callsign → route (airline + origin/destination * airports) and hex → aircraft type/registration. Free community API — cached - * aggressively: ONE upstream request per new key ever (404s negative-cached), - * persisted to disk so restarts don't re-hammer it. Adapted from skylight + * aggressively: successes and 404s are kept per key for 24 hours (TTL_MS) and + * persisted to disk so restarts don't re-hammer it; other failures are not + * cached. Adapted from skylight * (MIT) server/src/enrich/routes.ts. */ export function adsbdbProxy() { diff --git a/src/layers/flights/policy.js b/src/layers/flights/policy.js index 80d77dddd..2c015e6c9 100644 --- a/src/layers/flights/policy.js +++ b/src/layers/flights/policy.js @@ -219,8 +219,8 @@ export const COURSE_SLEW_DT_MAX_SEC = 0.25; // adsbdb enrichment (best-effort, fail-silent). Bounded fan-out: max 4 // concurrent requests, dispatches dripped ≥ENRICH_DISPATCH_GAP_MS apart // (≤5/s — adsbdb is a free community API; the dev-server proxy additionally -// caches per-key on disk forever, negative results included, so repeat -// sessions never re-hit adsbdb). Each key is requested at most once per +// caches successful and 404 responses per key for 24 hours, so later sessions +// may refresh them). Each key is requested at most once per // session. Priority jobs (tracked plane, model-eligible planes) jump the // queue; the ambient fleet sweep (below) fills the back at poll cadence. // --------------------------------------------------------------------------- @@ -243,7 +243,7 @@ export const ENRICH_DISPATCH_GAP_MS = 200; // of drip, so the backlog can't outgrow a poll and re-sorts fresh), and // - a ROLLING token-bucket budget (below) bounding the sustained ambient // request rate (repeat sessions resolve instantly from the proxy's -// permanent disk cache). +// 24-hour disk cache). // Fail-silent by contract: the sweep never throws into the poll loop, never // blocks rendering, and never touches tracking state. When a type answer // lands, _requestTypeEnrichment's callback swaps the billboard glyph + scale @@ -257,7 +257,7 @@ export const ENRICH_DISPATCH_GAP_MS = 200; // ENRICH_AMBIENT_REFILL_TOKENS every ENRICH_AMBIENT_REFILL_WINDOW_MS, clamped // at the ceiling (no banking beyond one bucket). Numbers: 150 / 5 min sustains // 0.5 req/s worst case — an order of magnitude under the 5/s drip that (with -// the 4-concurrent limit + the proxy's permanent disk cache) is the REAL +// the 4-concurrent limit + the proxy's 24-hour disk cache) is the REAL // politeness bound on adsbdb; the 300 ceiling preserves the old first-look // burst so a fresh region still classifies quickly. /** Bucket ceiling: max ambient tokens held at once (= the initial burst). */