Files
foxhunt/docs/deployment/SERVICE_DEPENDENCIES.md
jgrusewski 39c1028502 🚀 Wave 126 Wave 1 Complete: 6 agents deployed - 4/4 services healthy
Agent 106: ML health endpoint (HTTP/8095)
Agent 107: Redis test fix (serial_test isolation)
Agent 108: CLAUDE.md draft update (95-97% → 100%)
Agent 109: Prometheus/Grafana setup (31 alerts, 6 dashboards)
Agent 110: Deployment docs (9 files + 4 scripts)
Agent 111: Security audit prep (0 critical vulnerabilities)

Service Health: 4/4 healthy (100%)
Tests: 99%+ pass rate
Production: ~98% readiness

Next: Wave 2 (E2E, load, perf, security validation)
2025-10-08 00:11:38 +02:00

18 KiB

Foxhunt Service Dependencies

Architecture Overview

                       ┌─────────────┐
                       │     TLI     │ (Client)
                       │  (Terminal) │
                       │  Pure Client│
                       └──────┬──────┘
                              │
                         Port 50051
                         (gRPC/TLS)
                              │
                              ▼
                  ┌───────────────────────┐
                  │    API Gateway        │
                  │  ┌─────────────────┐  │
                  │  │ Authentication  │  │
                  │  │ Rate Limiting   │  │
                  │  │ Request Routing │  │
                  │  │ Config Mgmt     │  │
                  │  │ Audit Logging   │  │
                  │  └─────────────────┘  │
                  │  Port 50051 (gRPC)    │
                  │  Port 9091 (metrics)  │
                  │  Port 8080 (health)   │
                  └───────┬───────────────┘
                          │
        ┌─────────────────┼─────────────────┐
        │                 │                 │
        ▼                 ▼                 ▼
  ┌──────────┐    ┌──────────────┐   ┌────────────┐
  │ Trading  │    │ Backtesting  │   │ ML Training│
  │ Service  │    │   Service    │   │  Service   │
  │          │    │              │   │            │
  │Port 50052│    │  Port 50053  │   │ Port 50054 │
  │    9092  │    │      9093    │   │    9094    │
  │    8081  │    │      8083    │   │    8095    │
  └────┬─────┘    └──────┬───────┘   └─────┬──────┘
       │                 │                  │
       │                 │                  │
       └─────────────────┴──────────────────┘
                         │
           ┌─────────────┴────────────┐
           │                          │
           ▼                          ▼
   ┌────────────────┐        ┌────────────────┐
   │   PostgreSQL   │        │     Redis      │
   │   (TimescaleDB)│        │    (Cache)     │
   │                │        │                │
   │    Port 5432   │        │   Port 6379    │
   │ Health: 5433   │        │                │
   └────────┬───────┘        └────────┬───────┘
            │                         │
            ▼                         ▼
   ┌────────────────┐        ┌────────────────┐
   │ HashiCorp Vault│        │   InfluxDB     │
   │   (Secrets)    │        │  (Time Series) │
   │                │        │                │
   │    Port 8200   │        │   Port 8086    │
   └────────────────┘        └────────────────┘

           ┌─────────────────────────┐
           │   Monitoring Stack      │
           ├─────────────────────────┤
           │ Prometheus (9090)       │
           │ Grafana (3000)          │
           │ AlertManager (9093)     │
           └─────────────────────────┘

Service Port Reference

Service gRPC Port HTTP/Health Metrics Internal Port
API Gateway 50051 8080 9091 50050
Trading Service 50052 8081 9092 50051
Backtesting Service 50053 8083 9093 50052
ML Training Service 50054 8095 9094 50053
PostgreSQL 5432 5433 - -
Redis 6379 - - -
Vault 8200 8200 - -
InfluxDB 8086 8086 - -
Prometheus 9090 9090 - -
Grafana 3000 3000 - -

Startup Dependencies

Layer 1: Infrastructure (Start First)

These services MUST be running and healthy before starting any application services.

# Start infrastructure layer
docker-compose up -d postgres redis vault influxdb

# Wait for all to be healthy (30-60 seconds)
docker-compose ps | grep -E "(postgres|redis|vault|influxdb)"

# Verify health
docker exec foxhunt-postgres pg_isready -U foxhunt
docker exec foxhunt-redis redis-cli ping
curl -s http://localhost:8200/v1/sys/health
curl -s http://localhost:8086/health

PostgreSQL (TimescaleDB):

  • No dependencies
  • Critical: Database must be healthy before any service starts
  • Health check: pg_isready -U foxhunt
  • Startup time: 15-30 seconds

Redis:

  • No dependencies
  • Critical: Cache required for session management
  • Health check: redis-cli ping
  • Startup time: 5-10 seconds

HashiCorp Vault:

  • No dependencies
  • Critical: Secrets management for all services
  • Health check: curl http://localhost:8200/v1/sys/health
  • Startup time: 10-15 seconds
  • Note: Dev mode auto-unseals, production requires manual unsealing

InfluxDB:

  • No dependencies
  • Optional: Used for time-series metrics storage
  • Health check: curl http://localhost:8086/health
  • Startup time: 15-20 seconds

Layer 2: Core Services (After Infrastructure)

Application services depend on infrastructure being healthy.

# Wait for infrastructure
sleep 30

# Run database migrations
cargo sqlx migrate run

# Start core services
docker-compose up -d trading_service backtesting_service ml_training_service

# Wait for services to be healthy (60-120 seconds)
docker-compose ps | grep -E "(trading|backtesting|ml_training)"

Trading Service:

  • Required: PostgreSQL, Redis, Vault
  • Optional: None
  • Critical: Core trading logic, cannot start without database
  • Health check: curl http://localhost:8081/health
  • Startup time: 30-45 seconds

Backtesting Service:

  • Required: PostgreSQL, Vault
  • Optional: Redis, ML Training Service
  • Independent: Can run standalone for historical analysis
  • Health check: curl http://localhost:8083/health
  • Startup time: 60-90 seconds (model loading)

ML Training Service:

  • Required: PostgreSQL, Vault
  • Optional: Redis, Storage (S3/MinIO)
  • Independent: Can run standalone for model training
  • Health check: curl http://localhost:8095/health
  • Startup time: 60-120 seconds (model initialization, GPU warmup)

Layer 3: Gateway (After Core Services)

API Gateway depends on backend services being available.

# Wait for core services
sleep 60

# Start API Gateway
docker-compose up -d api_gateway

# Verify gateway is healthy
grpc_health_probe -addr=localhost:50051
curl http://localhost:8080/health

API Gateway:

  • Required: PostgreSQL, Redis, Vault, Trading Service
  • Optional: Backtesting Service, ML Training Service
  • Graceful degradation: If optional services unavailable, routes to them return 503
  • Health check: grpc_health_probe -addr=localhost:50051
  • Startup time: 20-30 seconds

Layer 4: Monitoring (Optional)

Monitoring stack can start independently at any time.

# Start monitoring stack
docker-compose up -d prometheus grafana alertmanager

# Verify dashboards accessible
curl http://localhost:9090  # Prometheus
curl http://localhost:3000  # Grafana

Prometheus:

  • No dependencies
  • Optional: Metrics collection and alerting
  • Startup time: 10-15 seconds

Grafana:

  • Required: Prometheus (for datasource)
  • Optional: Visualization dashboards
  • Startup time: 15-20 seconds

Service Requirements Matrix

Service PostgreSQL Redis Vault Trading Backtesting ML Training Storage
API Gateway Required Required Required Required ⚠️ Optional ⚠️ Optional Not Used
Trading Service Required Required Required - Not Used Not Used Not Used
Backtesting Required ⚠️ Optional Required Not Used - ⚠️ Optional ⚠️ Optional
ML Training Required ⚠️ Optional Required Not Used Not Used - ⚠️ Optional

Legend:

  • Required: Service will not start without this dependency
  • ⚠️ Optional: Service can operate with degraded functionality
  • Not Used: Service does not interact with this component

Dependency Health Checks

Automated Startup Script

Create scripts/start_foxhunt.sh:

#!/bin/bash

set -e  # Exit on error

echo "=== Foxhunt Startup Sequence ==="

# Layer 1: Infrastructure
echo -e "\n[1/4] Starting infrastructure layer..."
docker-compose up -d postgres redis vault influxdb

echo "Waiting for infrastructure (60s)..."
sleep 60

# Verify infrastructure health
echo "Verifying infrastructure..."
docker exec foxhunt-postgres pg_isready -U foxhunt || { echo "PostgreSQL not ready"; exit 1; }
docker exec foxhunt-redis redis-cli ping | grep -q PONG || { echo "Redis not ready"; exit 1; }
curl -sf http://localhost:8200/v1/sys/health || { echo "Vault not ready"; exit 1; }

# Run database migrations
echo -e "\n[2/4] Running database migrations..."
cargo sqlx migrate run

# Layer 2: Core services
echo -e "\n[3/4] Starting core services..."
docker-compose up -d trading_service backtesting_service ml_training_service

echo "Waiting for core services (120s)..."
sleep 120

# Verify core services health
echo "Verifying core services..."
curl -sf http://localhost:8081/health || { echo "Trading Service not ready"; exit 1; }
curl -sf http://localhost:8083/health || { echo "Backtesting Service not ready"; exit 1; }
curl -sf http://localhost:8095/health || { echo "ML Training Service not ready"; exit 1; }

# Layer 3: API Gateway
echo -e "\n[4/4] Starting API Gateway..."
docker-compose up -d api_gateway

echo "Waiting for API Gateway (30s)..."
sleep 30

# Verify gateway health
echo "Verifying API Gateway..."
grpc_health_probe -addr=localhost:50051 || { echo "API Gateway not ready"; exit 1; }

# Start monitoring (optional)
echo -e "\nStarting monitoring stack (optional)..."
docker-compose up -d prometheus grafana alertmanager

echo -e "\n=== Foxhunt Started Successfully ==="
docker-compose ps

Automated Shutdown Script

Create scripts/stop_foxhunt.sh:

#!/bin/bash

echo "=== Foxhunt Shutdown Sequence ==="

# Layer 3: Stop API Gateway first (client-facing)
echo -e "\n[1/4] Stopping API Gateway..."
docker-compose stop api_gateway

# Layer 2: Stop core services
echo -e "\n[2/4] Stopping core services..."
docker-compose stop trading_service backtesting_service ml_training_service

# Layer 1: Stop infrastructure
echo -e "\n[3/4] Stopping infrastructure..."
docker-compose stop postgres redis vault influxdb

# Stop monitoring
echo -e "\n[4/4] Stopping monitoring..."
docker-compose stop prometheus grafana alertmanager

echo -e "\n=== Foxhunt Stopped Successfully ==="
docker-compose ps

Failure Impact Analysis

PostgreSQL Failure

Impact:

  • Trading Service: Immediate failure, cannot execute trades
  • Backtesting Service: Cannot load historical data
  • ML Training Service: Cannot save/load models
  • API Gateway: Authentication fails (session data in DB)

Mitigation:

# PostgreSQL has built-in replication
# Configure streaming replication in production

# Monitor with Prometheus alert
- alert: PostgreSQLDown
  expr: up{job="postgres"} == 0
  for: 1m

Redis Failure

Impact:

  • ⚠️ Trading Service: Rate limiting disabled, session cache unavailable
  • ⚠️ Backtesting Service: Degraded performance (no caching)
  • ⚠️ ML Training Service: Feature cache unavailable
  • API Gateway: Session management fails, auth degraded

Mitigation:

# Redis has built-in persistence
# Configure AOF or RDB snapshots

# Graceful degradation in code
if redis.is_available() {
    use_redis_cache();
} else {
    fallback_to_database();
}

Trading Service Failure

Impact:

  • API Gateway: Trading routes return 503
  • Backtesting Service: Unaffected (independent)
  • ML Training Service: Unaffected (independent)

Mitigation:

# Deploy multiple Trading Service replicas
docker-compose up -d --scale trading_service=3

# API Gateway load balances across replicas

Vault Failure

Impact:

  • ⚠️ All Services: Cannot fetch new secrets (existing secrets cached)
  • New Service Starts: Cannot authenticate without secrets

Mitigation:

# Vault HA cluster in production
# Services cache secrets with TTL

# Emergency: Use environment variables as fallback
export DATABASE_PASSWORD="fallback_password"

Service Communication Patterns

Request Flow: Client → Trading Execution

TLI Client
   │
   │ 1. gRPC request (authenticated)
   ▼
API Gateway
   │
   │ 2. Validate JWT token (check Redis cache)
   │ 3. Check rate limit (Redis)
   │ 4. Forward to Trading Service
   ▼
Trading Service
   │
   │ 5. Validate order (business logic)
   │ 6. Check risk limits (PostgreSQL)
   │ 7. Execute trade (broker API)
   │ 8. Record in database (PostgreSQL)
   │ 9. Update cache (Redis)
   ▼
Response to Client

Request Flow: Backtesting

TLI Client
   │
   │ 1. Start backtest request
   ▼
API Gateway
   │
   │ 2. Route to Backtesting Service
   ▼
Backtesting Service
   │
   │ 3. Load market data (PostgreSQL/Parquet)
   │ 4. Optional: Load ML model (ML Training Service)
   │ 5. Run strategy simulation
   │ 6. Calculate metrics (Sharpe, drawdown)
   │ 7. Store results (PostgreSQL)
   ▼
Response with backtest ID

Request Flow: ML Model Training

ML Training Service (async job)
   │
   │ 1. Fetch training data (PostgreSQL)
   │ 2. Extract features (technical indicators)
   │ 3. Train model (GPU acceleration)
   │ 4. Validate model (test set)
   │ 5. Save checkpoint (S3/PostgreSQL)
   │ 6. Update model registry (PostgreSQL)
   │ 7. Publish metrics (InfluxDB)
   ▼
Model ready for inference

Circuit Breaker Configuration

Services implement circuit breakers to prevent cascade failures:

// Example: Trading Service → PostgreSQL
CircuitBreaker::new()
    .failure_threshold(5)        // Open after 5 failures
    .timeout(Duration::from_secs(30))
    .half_open_timeout(Duration::from_secs(60))

States:

  • Closed: Normal operation, requests pass through
  • Open: Too many failures, requests fail fast
  • Half-Open: Test if service recovered

Production Considerations

High Availability

  1. Database Replication:
# Primary-replica setup
services:
  postgres-primary:
    image: timescale/timescaledb:latest
    environment:
      - POSTGRES_REPLICATION_MODE=master

  postgres-replica:
    image: timescale/timescaledb:latest
    environment:
      - POSTGRES_REPLICATION_MODE=slave
      - POSTGRES_MASTER_HOST=postgres-primary
  1. Service Scaling:
# Scale critical services
docker-compose up -d --scale trading_service=3 --scale api_gateway=2
  1. Load Balancing:
# Add nginx for load balancing
services:
  nginx:
    image: nginx:alpine
    ports:
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf

Monitoring Dependencies

# Prometheus service discovery
scrape_configs:
  - job_name: 'api_gateway'
    static_configs:
      - targets: ['api_gateway:9091']

  - job_name: 'trading_service'
    static_configs:
      - targets: ['trading_service:9092']

  - job_name: 'postgres'
    static_configs:
      - targets: ['postgres_exporter:9187']

Dependency Health Dashboard

Grafana dashboard showing service dependencies:

{
  "dashboard": {
    "title": "Foxhunt Service Dependencies",
    "panels": [
      {
        "title": "Service Mesh Health",
        "targets": [
          {
            "expr": "up{job=~\"api_gateway|trading_service|backtesting_service|ml_training_service\"}"
          }
        ]
      },
      {
        "title": "Infrastructure Health",
        "targets": [
          {
            "expr": "up{job=~\"postgres|redis|vault\"}"
          }
        ]
      }
    ]
  }
}

Troubleshooting Dependency Issues

Check Dependency Chain

# Verify full dependency chain
scripts/check_dependencies.sh

Create scripts/check_dependencies.sh:

#!/bin/bash

echo "=== Checking Service Dependencies ==="

# Layer 1: Infrastructure
echo -e "\n[Infrastructure]"
docker exec foxhunt-postgres pg_isready -U foxhunt && echo "  PostgreSQL: ✓" || echo "  PostgreSQL: ✗"
docker exec foxhunt-redis redis-cli ping | grep -q PONG && echo "  Redis: ✓" || echo "  Redis: ✗"
curl -sf http://localhost:8200/v1/sys/health && echo "  Vault: ✓" || echo "  Vault: ✗"

# Layer 2: Core Services
echo -e "\n[Core Services]"
curl -sf http://localhost:8081/health && echo "  Trading Service: ✓" || echo "  Trading Service: ✗"
curl -sf http://localhost:8083/health && echo "  Backtesting Service: ✓" || echo "  Backtesting Service: ✗"
curl -sf http://localhost:8095/health && echo "  ML Training Service: ✓" || echo "  ML Training Service: ✗"

# Layer 3: Gateway
echo -e "\n[Gateway]"
grpc_health_probe -addr=localhost:50051 && echo "  API Gateway: ✓" || echo "  API Gateway: ✗"

echo -e "\n=== Dependency Check Complete ==="

References