|
| 1 | +# AGENTS.md: `query-host` |
| 2 | + |
| 3 | +## 1. Purpose & Architectural Intent |
| 4 | + |
| 5 | +This directory contains the `query-host` service, the central component of the `query-container`. |
| 6 | + |
| 7 | +**Core Intent**: To act as a robust, Dapr-enabled host for the `drasi-core` continuous query engine. It is responsible for managing the complete lifecycle of individual queries, making each query a stateful, addressable, and resilient entity. |
| 8 | + |
| 9 | +**Architectural Strategy**: |
| 10 | +- **Dapr Actor Model**: Each continuous query is instantiated as a Dapr `QueryActor`. This pattern is used to: |
| 11 | + - Manage the state of each query independently (e.g., its configuration, status). |
| 12 | + - Provide a reliable, addressable endpoint for managing the query's lifecycle (configure, deprovision, reconcile). |
| 13 | + - Ensure resilience, as Dapr can automatically reactivate actors on failure. |
| 14 | +- **Decoupled Worker Logic**: The `QueryActor` spawns a `QueryWorker` which contains the actual data processing logic. This separates the actor's lifecycle management from the core task of running the query. |
| 15 | + |
| 16 | +## 2. Core Dependencies & Data Flow |
| 17 | + |
| 18 | +- **`drasi-core` (Git Submodule)**: This is the high-performance, embeddable Rust library that performs the actual continuous query evaluation. The `query-host` acts as a runtime environment for it. |
| 19 | +- **Redis Streams**: The `QueryWorker` consumes a dedicated Redis Stream for each query, ensuring ordered, reliable processing of incoming `ChangeEvent` messages. `publish-api` service publushes the Change Events to the Redis stream. |
| 20 | +- **Dapr Pub/Sub**: After processing data through `drasi-core`, the `QueryWorker` publishes the resulting diffs to a separate Dapr pub/sub topic for consumption by downstream services like the `view-svc`. |
| 21 | + |
| 22 | +```mermaid |
| 23 | +graph TD |
| 24 | + subgraph Dapr Sidecar |
| 25 | + A[Dapr Runtime] |
| 26 | + end |
| 27 | +
|
| 28 | + subgraph Query Host Container |
| 29 | + B[DaprHttpServer] |
| 30 | + C[QueryActor] |
| 31 | + D[QueryWorker] |
| 32 | + E[drasi-core Engine] |
| 33 | + end |
| 34 | +
|
| 35 | + F[Input Redis Stream from Publish API] |
| 36 | + G[Output Dapr Pub/Sub] |
| 37 | + H[Query API component of Source] |
| 38 | +
|
| 39 | + A <--> B; |
| 40 | + B -- "Manages Lifecycle" --> C; |
| 41 | + C -- "Spawns & Supervises" --> D; |
| 42 | + D -- "Uses" --> E; |
| 43 | + D -- "Consumes From" --> F; |
| 44 | + E -- "Publishes To" --> G; |
| 45 | + D -- "Bootstraps From" --> H; |
| 46 | +``` |
| 47 | + |
| 48 | +```mermaid |
| 49 | +graph TD |
| 50 | + subgraph Dapr Actor Runtime |
| 51 | + A[QueryActor] |
| 52 | + end |
| 53 | +
|
| 54 | + subgraph QueryWorker Thread |
| 55 | + B[QueryWorker] -- Manages --> C{drasi-core Engine} |
| 56 | + D[RedisChangeStream] -- Feeds --> B |
| 57 | + C -- Publishes to --> E[ResultPublisher] |
| 58 | + C -- Schedules --> F[FutureQueue] |
| 59 | + end |
| 60 | +
|
| 61 | + G[Query API in Sources] |
| 62 | + H[Redis Stream] |
| 63 | + I[Pub/Sub Topic] |
| 64 | +
|
| 65 | + A -- Spawns/Manages --> B |
| 66 | + B -- Bootstraps from --> G |
| 67 | + D -- Reads from --> H |
| 68 | + E -- Publishes to --> I |
| 69 | + F -- Consumed by --> FutureConsumer -- Publishes back to --> H |
| 70 | +
|
| 71 | +``` |
| 72 | + |
| 73 | +## 3. Key Abstractions |
| 74 | + |
| 75 | +- **`QueryActor`**: The Dapr actor responsible for state management and lifecycle of a single continuous query. |
| 76 | +- **`QueryWorker`**: The core processing loop for a query. It bootstraps data from sources, consumes the change stream, and drives the `drasi-core` engine. |
| 77 | +- **`IndexFactory`**: A factory for providing pluggable storage backends (`ElementIndex`, `ResultIndex`, `FutureQueue`) to `drasi-core`, allowing for different persistence strategies (in-memory, Redis, RocksDB). |
| 78 | +- **`MiddlewareTypeRegistry`**: Enables extensible, declarative data transformation pipelines for pre-processing source data before it reaches the query engine. |
0 commit comments