6.4 KiB
6.4 KiB
Architecture
Horus is a hierarchical orchestration runtime with three layers: Coordinator, Supervisor, and Runner.
Overview
┌─────────────────────────────────────────────────────────┐
│ Coordinator │
│ (Workflow Engine - DAG Execution) │
│ │
│ • Parses workflow definitions │
│ • Resolves dependencies │
│ • Dispatches ready steps │
│ • Tracks workflow state │
└────────────────────┬────────────────────────────────────┘
│ OpenRPC (HTTP/Mycelium)
│
┌────────────────────▼────────────────────────────────────┐
│ Supervisor │
│ (Job Dispatcher & Authenticator) │
│ │
│ • Verifies job signatures │
│ • Routes jobs to runners │
│ • Manages runner registry │
│ • Tracks job lifecycle │
└────────────────────┬────────────────────────────────────┘
│ Redis Queue Protocol
│
┌────────────────────▼────────────────────────────────────┐
│ Runners │
│ (Job Executors) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Hero │ │ SAL │ │ Osiris │ │
│ │ Runner │ │ Runner │ │ Runner │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
Layers
1. Coordinator (Optional)
Purpose: Workflow orchestration and DAG execution
Responsibilities:
- Parse and validate workflow definitions
- Execute DAG-based flows
- Manage step dependencies
- Route jobs to appropriate supervisors
- Handle multi-step workflows
Use When:
- You need multi-step workflows
- Jobs have dependencies
- Parallel execution is required
- Complex data pipelines
2. Supervisor (Required)
Purpose: Job admission, authentication, and routing
Responsibilities:
- Receive jobs via OpenRPC interface
- Verify cryptographic signatures
- Route jobs to appropriate runners
- Manage runner registry
- Track job status and results
Features:
- OpenRPC API for job management
- HTTP and Mycelium transport
- Signature-based authentication
- Runner health monitoring
3. Runners (Required)
Purpose: Execute actual job workloads
Available Runners:
- Hero Runner: Executes heroscripts via Hero CLI
- SAL Runner: System operations (OS, K8s, cloud, etc.)
- Osiris Runner: Database operations with Rhai scripts
Common Features:
- Redis queue-based job polling
- Signature verification
- Timeout support
- Environment variable handling
Communication Protocols
Client ↔ Coordinator
- Protocol: OpenRPC
- Transport: HTTP or Mycelium
- Operations: Submit workflow, check status, retrieve results
Coordinator ↔ Supervisor
- Protocol: OpenRPC
- Transport: HTTP or Mycelium
- Operations: Create job, get status, retrieve logs
Supervisor ↔ Runner
- Protocol: Redis Queue
- Transport: Redis pub/sub and lists
- Operations: Push job, poll queue, store result
Job Flow
Simple Job (No Coordinator)
1. Client → Supervisor: create_job()
2. Supervisor: Verify signature
3. Supervisor → Redis: Push to runner queue
4. Runner ← Redis: Pop job
5. Runner: Execute job
6. Runner → Redis: Store result
7. Client ← Supervisor: get_job_result()
Workflow (With Coordinator)
1. Client → Coordinator: submit_workflow()
2. Coordinator: Parse DAG
3. Coordinator: Identify ready steps
4. Coordinator → Supervisor: create_job() for each ready step
5. Supervisor → Runner: Route via Redis
6. Runner: Execute and return result
7. Coordinator: Update workflow state
8. Coordinator: Dispatch next ready steps
9. Repeat until workflow complete
Security Model
Authentication
- Jobs must be cryptographically signed
- Signatures verified at Supervisor layer
- Public key infrastructure for identity
Authorization
- Runners only execute signed jobs
- Signature verification before execution
- Untrusted jobs rejected
Transport Security
- Optional TLS for HTTP transport
- End-to-end encryption via Mycelium
- No plaintext credentials
Deployment Patterns
Minimal Setup
Redis + Supervisor + Runner(s)
Single machine, simple job execution.
Distributed Setup
Redis Cluster + Multiple Supervisors + Runner Pool
High availability, load balancing.
Full Orchestration
Coordinator + Multiple Supervisors + Runner Pool
Complex workflows, multi-step pipelines.
Design Principles
- Hierarchical: Clear separation of concerns across layers
- Secure: Signature-based authentication throughout
- Scalable: Horizontal scaling at each layer
- Observable: Comprehensive logging and status tracking
- Flexible: Multiple runners for different workload types