docs(plans): scrub LmxProxy references from design plans
Remove the LmxProxy work package (WP-8) from phase-3b, the CD-DCL-1..6 protocol details, Q9/Q-P3B-2 from the questions log, the LmxProxy component-design rows in requirements-traceability, and the inline mentions across phase-0, phase-4, the gRPC streaming plans, and the primary/backup data-connection plans.
This commit is contained in:
@@ -19,7 +19,7 @@ Debug streaming events currently flow through Akka.NET ClusterClient (`InstanceA
|
||||
| **Reconnection** | ClusterClient auto-reconnect (coarse, cluster-level) | gRPC channel-level reconnect per subscription |
|
||||
| **Serialization** | Akka.NET Hyperion (runtime IL, fragile across versions) | Protocol Buffers (schema-driven, cross-platform) |
|
||||
|
||||
The DCL already uses this exact pattern — `RealLmxProxyClient` opens gRPC server-streaming subscriptions to LmxProxy servers for real-time tag value updates. This plan applies the same pattern to site→central communication.
|
||||
gRPC server-streaming is an established pattern for real-time tag value updates; this plan applies the same pattern to site→central communication.
|
||||
|
||||
## Architecture
|
||||
|
||||
@@ -216,7 +216,7 @@ message AttributeValueUpdate {
|
||||
string instance_unique_name = 1;
|
||||
string attribute_path = 2;
|
||||
string attribute_name = 3;
|
||||
string value = 4; // string-encoded (same as LmxProxy VtqMessage pattern)
|
||||
string value = 4; // string-encoded
|
||||
string quality = 5; // "Good", "Uncertain", "Bad"
|
||||
int64 timestamp_utc_ticks = 6;
|
||||
}
|
||||
@@ -230,7 +230,7 @@ message AlarmStateUpdate {
|
||||
}
|
||||
```
|
||||
|
||||
Pre-generate C# stubs and check into `src/ScadaLink.Communication/SiteStreamGrpc/` (same pattern as LmxProxy — no `protoc` in Docker for ARM64 compatibility).
|
||||
Pre-generate C# stubs and check into `src/ScadaLink.Communication/SiteStreamGrpc/` — no `protoc` in Docker for ARM64 compatibility.
|
||||
|
||||
## Server-Streaming Pattern (Site Side)
|
||||
|
||||
@@ -304,8 +304,6 @@ builder.Services.AddGrpc();
|
||||
app.MapGrpcService<SiteStreamGrpcServer>();
|
||||
```
|
||||
|
||||
Reference: `infra/lmxfakeproxy/Program.cs` uses the identical Kestrel setup.
|
||||
|
||||
## Client-Streaming Pattern (Central Side)
|
||||
|
||||
### gRPC Client Implementation
|
||||
@@ -346,8 +344,6 @@ public async Task<StreamSubscription> SubscribeAsync(
|
||||
}
|
||||
```
|
||||
|
||||
Reference: `src/ScadaLink.DataConnectionLayer/Adapters/RealLmxProxyClient.cs` uses the identical background-task-reading-stream pattern for LmxProxy subscriptions.
|
||||
|
||||
### Port Resolution
|
||||
|
||||
### Client Factory
|
||||
@@ -744,11 +740,6 @@ case ScriptErrorEvent error:
|
||||
|
||||
| Pattern | File | Relevance |
|
||||
|---------|------|-----------|
|
||||
| Proto file definition | `src/ScadaLink.DataConnectionLayer/Adapters/Protos/scada.proto` | Same proto3 syntax, server streaming (`stream VtqMessage`) |
|
||||
| Pre-generated C# stubs | `src/ScadaLink.DataConnectionLayer/Adapters/LmxProxyGrpc/` | Same approach — checked-in stubs, no `protoc` at build time |
|
||||
| gRPC client + stream reader | `src/ScadaLink.DataConnectionLayer/Adapters/RealLmxProxyClient.cs` | Background task reads `ResponseStream`, invokes callback |
|
||||
| gRPC server implementation | `infra/lmxfakeproxy/Services/ScadaServiceImpl.cs` | Service base class override pattern |
|
||||
| Kestrel HTTP/2 setup | `infra/lmxfakeproxy/Program.cs` | `HttpProtocols.Http2`, `AddGrpc()`, `MapGrpcService<T>()` |
|
||||
| SiteStreamManager | `src/ScadaLink.SiteRuntime/Streaming/SiteStreamManager.cs` | Subscribe/filter by instance, per-subscriber buffer, DropHead overflow |
|
||||
| Per-site client caching | `CentralCommunicationActor._siteClients` dictionary | One client per site, refresh on address change |
|
||||
| Bridge actor pattern | `src/ScadaLink.Communication/Actors/DebugStreamBridgeActor.cs` | Per-session actor with callbacks, adapted to use gRPC instead of Akka messages |
|
||||
|
||||
Reference in New Issue
Block a user