Skip to content

fix: serialize OpenSky requests with global 429 cooldown#332

Merged
koala73 merged 1 commit into
mainfrom
fix/opensky-429-serializer
Feb 24, 2026
Merged

fix: serialize OpenSky requests with global 429 cooldown#332
koala73 merged 1 commit into
mainfrom
fix/opensky-429-serializer

Conversation

@koala73

@koala73 koala73 commented Feb 24, 2026

Copy link
Copy Markdown
Owner

Summary

Fixes OpenSky 429 rate-limit storm that prevents any aircraft data from flowing.

Root cause: 5 unique bbox queries fire simultaneously when the 30s negative cache expires → ALL get 429'd → ALL re-cached as negative → repeat forever. opensky=0 positive cache hits in metrics.

Fix — two mechanisms:

  1. Global 429 cooldown (90s default, env OPENSKY_429_COOLDOWN_MS): When ANY request gets 429, ALL upstream requests blocked for 90s. Reduces wasted requests from 5/30s → 1/90s.

  2. Request serializer queue (2s spacing, env OPENSKY_REQUEST_SPACING_MS): Upstream requests go one at a time. First succeeds → cached → remaining 4 serve from cache.

Also includes

  • Promisified upstream fetch (replaces callback-based https.get)
  • /opensky-reset clears 429 cooldown
  • /metrics and /opensky-diag expose global429CooldownRemainingMs

Test plan

  • Deploy to Railway
  • Check /metricsglobal429CooldownRemainingMs visible
  • After cooldown expires, first fetch should return 200
  • cacheHits > 0 in metrics = data flowing
  • If stuck: /opensky-reset clears all state

Root cause: 5 unique bbox queries fire simultaneously when the 30s
negative cache expires, ALL get 429'd by OpenSky, ALL get re-cached
as negative for 30s, cycle repeats forever with zero data flowing.

Fix:
- Global 429 cooldown (90s default, env-configurable) — when ANY
  request gets 429, ALL upstream requests are blocked until cooldown
  expires. Reduces wasted requests from 5/30s to 1/90s.
- Request serializer queue — upstream requests go one at a time with
  2s minimum spacing. Prevents concurrent burst that triggers rate limit.
- Promisified upstream fetch replaces callback-based https.get for
  cleaner queue integration.
- /opensky-reset clears the 429 cooldown.
- /metrics and /opensky-diag expose cooldown state for debugging.
@vercel

vercel Bot commented Feb 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
worldmonitor Ready Ready Preview, Comment Feb 24, 2026 5:24pm
worldmonitor-finance Ready Ready Preview, Comment Feb 24, 2026 5:24pm
worldmonitor-happy Ready Ready Preview, Comment Feb 24, 2026 5:24pm
worldmonitor-startup Ready Ready Preview, Comment Feb 24, 2026 5:24pm

Request Review

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@koala73
koala73 merged commit 1ec73d1 into main Feb 24, 2026
5 checks passed
koala73 added a commit that referenced this pull request Feb 24, 2026
## What's Changed

### Performance
- perf: defer YouTube/map init and stagger data loads to reduce blocking time (#287)

### Features
- feat: universal country detection — CII scoring for all countries (#344)
- feat: add Mexico as CII hotspot for cartel/security monitoring (#327)
- feat: add Mexico and LatAm security feeds for instability coverage (#325)
- feat: add category pills and search filter to Panels tab (#322)
- feat: consolidate settings into unified tabbed modal (#319)
- feat: add Island Times (Palau) RSS feed (#317)
- feat: add AI Flow settings popup for web-only AI provider control (#314)
- feat: optional channels with tab-based region browse UI (#295)
- feat: custom channel management (#282)
- feat: add Bild RSS feed scoped to German locale (#312)

### Bug Fixes
- fix: suppress notification sound when popup alerts are disabled
- fix: prevent entity conflation in pane summarization (#341)
- fix: add Mexico to COUNTRY_BOUNDS and COUNTRY_ALIASES (#338)
- fix: make OpenSky cache TTLs env-configurable (#333)
- fix: serialize OpenSky requests with global 429 cooldown (#332)
- fix: replace RSSHub feeds with native/Google News alternatives (#331)
- fix: OpenSky auth resilience — retry, IPv4, no negative cache on auth fail (#329)
- fix: add CARTO and OpenStreetMap attribution to map (#323)
- fix: add drag cleanup handlers and suppress click after drag-drop (#315)
- fix: replace HTML5 drag API with mouse events for WKWebView (#313)
- fix: open channel settings as inline modal instead of separate window (#311)
- fix: sync YouTube live panel mute state with native player controls (#285)
- fix: strip Ollama reasoning tokens from summaries (#299)
- fix: open external links in system browser on Tauri desktop (#297)
- fix: add User-Agent and Cloudflare 403 detection to secret validation (#296)
- fix: infra cost optimizations round 2 (#275)
- fix: enforce military bbox filtering (#284)
- fix: infrastructure cost optimizations across caching, polling, batching (#283)
- fix: circuit breaker persistent cache with safety fixes (#281)
- fix: immediately refresh stale services when tab regains focus (#277)

### Security
- Security hardening: SSRF protection, auth gating, and token generation (#343)
- Harden Railway relay auth, caching, and proxy routing (#320)
- Build/runtime hardening and dependency security updates (#286)
- fix: harden embed postMessage origin check (#302)
@koala73
koala73 deleted the fix/opensky-429-serializer branch February 25, 2026 08:03
andreteow pushed a commit to andreteow/worldmonitor-a47 that referenced this pull request Feb 25, 2026
Root cause: 5 unique bbox queries fire simultaneously when the 30s
negative cache expires, ALL get 429'd by OpenSky, ALL get re-cached
as negative for 30s, cycle repeats forever with zero data flowing.

Fix:
- Global 429 cooldown (90s default, env-configurable) — when ANY
  request gets 429, ALL upstream requests are blocked until cooldown
  expires. Reduces wasted requests from 5/30s to 1/90s.
- Request serializer queue — upstream requests go one at a time with
  2s minimum spacing. Prevents concurrent burst that triggers rate limit.
- Promisified upstream fetch replaces callback-based https.get for
  cleaner queue integration.
- /opensky-reset clears the 429 cooldown.
- /metrics and /opensky-diag expose cooldown state for debugging.
facusturla pushed a commit to facusturla/worldmonitor that referenced this pull request Feb 27, 2026
Root cause: 5 unique bbox queries fire simultaneously when the 30s
negative cache expires, ALL get 429'd by OpenSky, ALL get re-cached
as negative for 30s, cycle repeats forever with zero data flowing.

Fix:
- Global 429 cooldown (90s default, env-configurable) — when ANY
  request gets 429, ALL upstream requests are blocked until cooldown
  expires. Reduces wasted requests from 5/30s to 1/90s.
- Request serializer queue — upstream requests go one at a time with
  2s minimum spacing. Prevents concurrent burst that triggers rate limit.
- Promisified upstream fetch replaces callback-based https.get for
  cleaner queue integration.
- /opensky-reset clears the 429 cooldown.
- /metrics and /opensky-diag expose cooldown state for debugging.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant