Add 12 new sprint files (Integrations, Graph, JobEngine, FE, Router, AdvisoryAI), archive completed scheduler UI sprint, update module architecture docs (router, graph, jobengine, web, integrations), and add Gitea entrypoint script for local dev. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6.6 KiB
6.6 KiB
Router · Messaging Transport over Valkey
Status
- Implemented in Sprint 8100.0011.0003.
- Core components: Gateway DI wiring, GatewayHostedService integration, GatewayTransportClient dispatch.
- Last updated: 2026-04-05 (UTC).
Purpose
Enable Gateway ↔ microservice Router traffic over an offline-friendly, Redis-compatible transport (Valkey) by using the existing Messaging transport layer:
- Router transport:
StellaOps.Router.Transport.Messaging - Messaging backend:
StellaOps.Messaging.Transport.Valkey
This supports environments where direct TCP/TLS microservice connections are undesirable, and where an internal message bus is the preferred control plane.
Implementation Summary
Libraries
StellaOps.Router.Transport.Messaging— Router transport layer over messagingStellaOps.Messaging.Transport.Valkey— Valkey/Redis backend for messagingStellaOps.Messaging— Core messaging abstractions and DI
Gateway Integration
- Program.cs — Conditional registration of
ValkeyTransportPluginandAddMessagingTransportServer() - GatewayOptions.cs —
GatewayMessagingTransportOptionsfor Valkey connection and queue configuration - GatewayHostedService.cs — Start/stop
MessagingTransportServer, subscribe to events - GatewayTransportClient.cs — Dispatch to
TransportType.Messagingconnections
High-Level Flow
- Microservice connects via messaging transport:
- publishes a slim
HELLOmessage with instance identity to the gateway control queue
- publishes a slim
- Gateway processes HELLO:
- registers the connection identity and requests endpoint metadata replay when needed
- Microservice answers the replay request:
- publishes an
EndpointsUpdateframe with endpoints, schemas, and OpenAPI metadata
- publishes an
- Gateway applies the metadata replay:
- updates routing state, effective claims, and aggregated OpenAPI
- Gateway routes an HTTP request to a microservice:
- publishes a REQUEST message to the service request queue
- Microservice handles request:
- executes handler (or ASP.NET bridge) and publishes a RESPONSE message
- Gateway returns response to the client.
Messaging-specific recovery behavior:
- Startup resync: the gateway sends
ResyncRequestimmediately after a slimHELLO. - Administrative resync:
POST /api/v1/gateway/administration/router/resynccan request replay for one connection or the whole messaging fleet. - Gateway-state miss: if a heartbeat arrives for an unknown messaging connection, the gateway seeds minimal state from the heartbeat identity and requests replay instead of waiting for a reconnect.
Queue Topology (Conceptual)
The Messaging transport uses a small set of queues (names are configurable):
- Gateway control queue: receives service-to-gateway HELLO / HEARTBEAT / ENDPOINTS_UPDATE / RESPONSE frames
- Per-service incoming queues: gateway publishes REQUEST / CANCEL / RESYNC_REQUEST frames targeted to a service
- Dead letter queues (optional): for messages that exceed retries/leases
Configuration
Gateway YAML Configuration
Gateway:
Transports:
Messaging:
Enabled: true
ConnectionString: "valkey:6379"
Database: 0
RequestQueueTemplate: "router:requests:{service}"
ResponseQueueName: "router:responses"
ConsumerGroup: "router-gateway"
RequestTimeout: "30s"
LeaseDuration: "5m"
BatchSize: 10
HeartbeatInterval: "10s"
Gateway DI Registration
// In Program.cs (already implemented)
if (bootstrapOptions.Transports.Messaging.Enabled)
{
builder.Services.AddMessagingTransport<ValkeyTransportPlugin>(
builder.Configuration, "Gateway:Transports:Messaging");
builder.Services.AddMessagingTransportServer();
}
Microservice
- Register router transports via plugin loading (no hard transport references in
StellaOps.Router.AspNet). - Use
AddRouterMicroservice(...)fromStellaOps.Router.AspNet; it resolves configured gateway transport types throughRouterTransportPluginLoader. - For messaging mode, the
StellaOps.Router.Transport.Messagingplugin registers:- backend messaging plugin loading (
AddMessagingPlugins(...), env/config keytransport=valkey) - Router messaging transport client (
AddMessagingTransportClient)
- backend messaging plugin loading (
- Ensure the following plugin DLLs are available either as service dependencies or under configured plugin directories:
StellaOps.Router.Transport.Messaging.dllStellaOps.Messaging.Transport.Valkey.dll
Operational Semantics (Draft)
- At-least-once delivery: message queues and leases imply retries are possible; handlers should be idempotent where feasible.
- Lease timeouts: must be tuned to max handler execution time; long-running tasks should respond with 202 + job id rather than blocking.
- Determinism: message ordering may vary; Router must not depend on arrival order for correctness (only for freshness/telemetry).
- Push-first with recovery fallback: Valkey Pub/Sub notifications wake consumers immediately when possible. If notifications silently stop, the queue layer still wakes via timeout fallback, connection-restored hooks, and randomized proactive re-subscription so requests and resync control frames do not wedge forever.
- Queue fallback cost: every wake can perform
XAUTOCLAIMplusXREADGROUPchecks before sleeping again. That traffic is expected resilience overhead, but it is materially smaller than replaying the full endpoint catalog on every heartbeat interval.
Security Notes
- Messaging transport is internal. External identity must still be enforced at the Gateway.
- The Gateway must not trust client-supplied identity headers; it must overwrite reserved headers before dispatch.
- See
docs/modules/gateway/identity-header-policy.md.
- See
Implementation Status
Completed (Sprint 8100.0011.0003)
- ✅ Wire Messaging transport into Gateway:
- start/stop
MessagingTransportServerinGatewayHostedService - subscribe to
OnHelloReceived,OnHeartbeatReceived,OnEndpointsUpdated,OnResponseReceived,OnConnectionClosedevents - reuse routing state updates and claims store updates
- start/stop
- ✅ Extend Gateway transport client to support
TransportType.Messagingfor dispatch. - ✅ Add config options (
GatewayMessagingTransportOptions) and DI mappings. - ✅ Switch messaging registration from periodic full HELLO replay to explicit
ResyncRequest/EndpointsUpdatecontrol frames.
Remaining Work
- Add deployment examples (compose/helm) for Valkey transport.
- Add integration tests using ValkeyFixture:
- microservice HELLO registration via messaging
- request dispatch + response return
- Validate streaming support (or document as out-of-scope).