Skip to main content

Architecture

High-level system design and data flow.


πŸ—οΈ System Overview​

Client β†’ API Server β†’ Asynq (Redis) β†’ Worker Pool β†’ DNS Servers
↓ ↓
Results ← ─ ─ ─ ─ ─ β”˜

πŸ“Š Components​


πŸ”„ Request Flow​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  1. POST /dns-lookup         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Client │─────────────────────────────>β”‚ API Server β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ chi router β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
β”‚ 2. Validate
β”‚ 3. Rate limit
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Asynq β”‚
β”‚ Enqueue β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
β”‚ 4. Store task
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” 202 {task_id} β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Client β”‚<─────────────────────────────│ Redis β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ 5. Dequeue
β”‚ 6. Poll GET /tasks/{id} β–Ό
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ Worker Pool β”‚
β”‚ β”‚ (dnsproxy) β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ 7. Query DNS
β”‚ β–Ό
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ DNS Servers β”‚
β”‚ β”‚ UDP/TCP/TLS/ β”‚
β”‚ β”‚ HTTPS/QUIC β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ 8. Response
β”‚ β–Ό
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ Redis β”‚
β”‚ β”‚ Store result β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β–Ό β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ 9. Fetch result
β–Ό
{task_status: SUCCESS, task_result: {...}}

🧩 Components​

ComponentTechnologyResponsibilityScalability
API Serverchi + TollboothHTTP routing, rate limitingStateless, horizontal
Task QueueAsynq + RedisTask persistence, distributionRedis cluster
Worker PoolGo + dnsproxyDNS query executionConfigurable concurrency
StorageRedisTask state, resultsRedis cluster
MetricsPrometheusObservabilityPull-based

πŸ” Task Lifecycle​


πŸš€ Deployment Architectures​

Single Instance (Development)​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Docker Compose β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ API β”‚β†’ β”‚ Redis │← β”‚Workerβ”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Multi-Instance (Production)​

      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ LB/Nginxβ”‚
β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ API-1 β”‚ β”‚ API-2 β”‚
β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚Redis Clusterβ”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”
β”‚Work-1β”‚β”‚Work-2β”‚β”‚Work-Nβ”‚
β””β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”˜

Kubernetes (Scalable)​


πŸ”§ Protocol Stack​

LayerComponentImplementation
APIHTTP Routerchi
QueueTask ManagementAsynq
WorkerConcurrencyGo goroutines
DNSMulti-ProtocolAdGuard dnsproxy
TransportUDP/TCP/TLS/HTTPS/QUICmiekg/dns, crypto/tls, net/http, quic-go

πŸ“ˆ Scaling​

ComponentHorizontalVerticalLimit
APIβœ… StatelessLow CPU/MemoryUnlimited
Workerβœ… Task-basedModerate CPUDNS rate limits
Redis⚠️ Cluster neededHigh memory10k req/s (single)

Concurrency: Total = Workers Γ— MAX_WORKERS


⚑ Performance​

πŸ”¬ Benchmarks in progress - Comprehensive performance comparison coming soon.


πŸ” Security Layers​

Internet β†’ TLS (Reverse Proxy) β†’ Auth (optional) β†’ API β†’ Internal Network (Redis/Workers)
  1. TLS termination at reverse proxy
  2. Rate limiting (proxy + API)
  3. Optional authentication
  4. Network isolation for Redis
  5. Input validation

❌ Error Handling​

ErrorHTTP CodeBehavior
Invalid request400Immediate rejection
Rate limit429Backoff required
No workers503Retry later
DNS timeout200Per-server error in result

Philosophy: API never fails for DNS errors - each server independent, partial success allowed.


πŸ“Š Monitoring​

API/Workers β†’ /metrics β†’ Prometheus β†’ Grafana β†’ Alertmanager

See Monitoring Guide for full details.


πŸ“š See Also​