Architecture Overview
RedMist Timing & Scoring is a cloud-native, microservices-based platform for real-time race timing and scoring.
System Architecture
graph TB
Users[Internet / Users]
CF[Cloudflare / Load Balancer]
StatusAPI[Status API]
EventAPI[Event Mgmt API]
UserAPI[User Mgmt API]
Redis[(Redis Cache & Pub/Sub)]
TimingService[Timing & Scoring Service]
Orchestrator[Event Orchestrator]
ControlLog[Control Log Processor]
DB[(SQL Server Database)]
RelayAPI[Relay API]
TrackRelay[Track-side Relay Software]
Users --> CF
CF --> StatusAPI
CF --> EventAPI
CF --> UserAPI
StatusAPI --> Redis
EventAPI --> Redis
UserAPI --> Redis
Redis --> TimingService
Redis --> Orchestrator
Redis --> ControlLog
TimingService --> DB
TrackRelay -.->|Track-side| RelayAPI
RelayAPI --> DB
style Users fill:#e1f5ff
style CF fill:#fff4e1
style Redis fill:#ffe1e1
style DB fill:#ffe1e1
Core Services
Public-Facing APIs
Status API
Purpose: Real-time event status and timing data
Technology: ASP.NET Core 9, SignalR, Redis
Endpoints: /Events, /Organization
Features:
- Live event listings
- Real-time WebSocket updates
- Session results
- Car lap data
- Control logs
Event Management API
Purpose: Event configuration and administration
Technology: ASP.NET Core 9, Entity Framework
Endpoints: /Event, /Organization
Features:
- Event CRUD operations
- Organization settings
- Control log configuration
- Event activation
User Management API
Purpose: User and organization management
Technology: ASP.NET Core 9, Keycloak
Endpoints: /Organization
Features:
- Organization provisioning
- User-organization mappings
- Relay client creation
- Keycloak integration
Internal Services
Timing & Scoring Service
Purpose: Real-time event processing
Technology: ASP.NET Core 9, MessagePack
Features:
- RMonitor data processing
- Multiloop data processing
- X2 timing system integration
- Position calculations
- Lap time processing
- Flag state management
Event Orchestrator
Purpose: Event lifecycle management
Technology: ASP.NET Core 9, Kubernetes
Features:
- Event processor provisioning
- Container orchestration
- Service scaling
- Health monitoring
Control Log Processor
Purpose: Race control log processing
Technology: ASP.NET Core 9
Features:
- Control log fetching
- Penalty processing
- Driver notification
- Log enrichment
Event Logger
Purpose: Event data logging
Technology: ASP.NET Core 9
Features:
- Source data logging
- Debug information
- Performance metrics
Relay API
Purpose: Track-side data ingestion
Technology: ASP.NET Core 9, SignalR
Features:
- Timing data reception
- Transponder data
- Session changes
- Flag updates
- Metadata sync
Data Flow
Real-Time Event Updates
graph LR
Track[Track Equipment]
Relay[Relay Software]
RelayAPI[Relay API]
RedisPubSub[Redis Pub/Sub]
TimingService[Timing Service]
SignalR[SignalR Backplane]
SQLDB[(SQL Database)]
StatusAPI[Status API]
Clients[WebSocket Clients]
Track --> Relay
Relay --> RelayAPI
RelayAPI --> RedisPubSub
RedisPubSub --> TimingService
TimingService --> SignalR
TimingService --> SQLDB
SignalR --> StatusAPI
StatusAPI --> Clients
style Track fill:#e1f5ff
style SQLDB fill:#ffe1e1
style RedisPubSub fill:#ffe1e1
Event Management Flow
graph LR
User[User]
EventAPI[Event Management API]
DB[(Database)]
Redis[Redis Notification]
Orchestrator[Event Orchestrator]
K8s[Kubernetes API]
Processor[Event Processor]
User --> EventAPI
EventAPI --> DB
DB --> Redis
Redis --> Orchestrator
Orchestrator --> K8s
K8s --> Processor
style DB fill:#ffe1e1
style Redis fill:#ffe1e1
Technology Stack
Backend
- .NET 9 - Primary framework
- ASP.NET Core - Web APIs
- Entity Framework Core - ORM
- SignalR - Real-time communication
- Redis - Caching and pub/sub
- MessagePack - Binary serialization
- NLog - Logging
Data Storage
- SQL Server - Primary database
- Redis - Cache and message broker
- Hybrid Cache - L1/L2 caching
Infrastructure
- Kubernetes - Container orchestration
- Docker - Containerization
- Cloudflare - CDN and DDoS protection
- Prometheus - Metrics
- Keycloak - Authentication
Client Libraries
- **@microsoft/signalr** - JavaScript/TypeScript
- signalrcore - Python
- MessagePack - Binary protocol
Design Patterns
Microservices
Each service has a single responsibility and can be scaled independently.
Event-Driven Architecture
Services communicate via Redis pub/sub for loose coupling.
CQRS (Command Query Responsibility Segregation)
- Commands: Event Management API
- Queries: Status API
Circuit Breaker
Resilient communication between services with exponential backoff.
Repository Pattern
Data access abstraction with Entity Framework.
Dependency Injection
Built-in .NET DI container for loose coupling.
Scalability
Horizontal Scaling
- Status API: Multiple instances behind load balancer
- Timing Service: One instance per event (event-based partitioning)
- Event Management: Stateless, can scale freely
Caching Strategy
- L1 Cache: In-memory (per instance)
- L2 Cache: Redis (shared)
- TTL: 4 hours (configurable)
Database
- Read Replicas: For query load distribution
- Indexing: Optimized for common queries
- Partitioning: By organization and event
Security
Authentication
- OAuth 2.0 with Keycloak
- JWT tokens
- Client credentials flow for services
- Authorization code flow for users
Authorization
- Role-based access control
- Organization-scoped data access
- API-level authorization
Network Security
- HTTPS only (TLS 1.2+)
- CORS configured
- Rate limiting (planned)
- DDoS protection via Cloudflare
Monitoring & Observability
Health Checks
/healthz/startup- Initial health/healthz/live- Liveness probe/healthz/ready- Readiness probe
Metrics
- Prometheus metrics exposed
- Custom gauges for connections
- Performance counters
Logging
- Structured logging with NLog
- Centralized logs (planned)
- Log levels configurable
Deployment
Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: status-api
spec:
replicas: 3
selector:
matchLabels:
app: status-api
template:
spec:
containers:
- name: status-api
image: redmist/status-api:latest
ports:
- containerPort: 8080
env:
- name: REDIS_SVC
value: redis-service
- name: ConnectionStrings__Default
valueFrom:
secretKeyRef:
name: db-secret
key: connection-string
CI/CD
- GitHub Actions for build
- Docker images
- Helm charts for deployment