feat(redundancy): wire dbHealth into OpcUaPublishActor + spawn PeerProbeSupervisor per node
This commit is contained in:
@@ -32,6 +32,7 @@ public static class ServiceCollectionExtensions
|
|||||||
public const string HistorianAdapterActorName = "historian-adapter";
|
public const string HistorianAdapterActorName = "historian-adapter";
|
||||||
public const string DependencyMuxActorName = "dependency-mux";
|
public const string DependencyMuxActorName = "dependency-mux";
|
||||||
public const string OpcUaPublishActorName = "opcua-publish";
|
public const string OpcUaPublishActorName = "opcua-publish";
|
||||||
|
public const string PeerProbeSupervisorName = "peer-probe-supervisor";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Registers shared runtime services. Currently binds <see cref="IAlarmHistorianSink"/>
|
/// Registers shared runtime services. Currently binds <see cref="IAlarmHistorianSink"/>
|
||||||
@@ -213,10 +214,19 @@ public static class ServiceCollectionExtensions
|
|||||||
serviceLevel: serviceLevel,
|
serviceLevel: serviceLevel,
|
||||||
localNode: roleInfo.LocalNode,
|
localNode: roleInfo.LocalNode,
|
||||||
dbFactory: dbFactory,
|
dbFactory: dbFactory,
|
||||||
applier: applier),
|
applier: applier,
|
||||||
|
dbHealthProbe: dbHealth),
|
||||||
OpcUaPublishActorName);
|
OpcUaPublishActorName);
|
||||||
registry.Register<OpcUaPublishActorKey>(publishActor);
|
registry.Register<OpcUaPublishActorKey>(publishActor);
|
||||||
|
|
||||||
|
// Per-node peer-probe supervisor — keeps one OPC UA TCP probe per OTHER non-Detached
|
||||||
|
// driver node, so every node is continuously probed by all its peers. OpcUaPublishActor
|
||||||
|
// consumes the resulting probe verdicts to learn this node's own reachability.
|
||||||
|
var peerProbes = system.ActorOf(
|
||||||
|
PeerProbeSupervisor.Props(roleInfo.LocalNode),
|
||||||
|
PeerProbeSupervisorName);
|
||||||
|
registry.Register<PeerProbeSupervisorKey>(peerProbes);
|
||||||
|
|
||||||
var driverHost = system.ActorOf(
|
var driverHost = system.ActorOf(
|
||||||
DriverHostActor.Props(dbFactory, roleInfo.LocalNode, coordinator: null,
|
DriverHostActor.Props(dbFactory, roleInfo.LocalNode, coordinator: null,
|
||||||
driverFactory: driverFactory, localRoles: roleInfo.LocalRoles,
|
driverFactory: driverFactory, localRoles: roleInfo.LocalRoles,
|
||||||
@@ -246,3 +256,6 @@ public sealed class DbHealthProbeActorKey { }
|
|||||||
public sealed class HistorianAdapterActorKey { }
|
public sealed class HistorianAdapterActorKey { }
|
||||||
public sealed class DependencyMuxActorKey { }
|
public sealed class DependencyMuxActorKey { }
|
||||||
public sealed class OpcUaPublishActorKey { }
|
public sealed class OpcUaPublishActorKey { }
|
||||||
|
|
||||||
|
/// <summary>Marker key for the per-node PeerProbeSupervisor.</summary>
|
||||||
|
public sealed class PeerProbeSupervisorKey { }
|
||||||
|
|||||||
@@ -50,17 +50,20 @@ public sealed class ServiceCollectionExtensionsTests
|
|||||||
var historian = host.Services.GetRequiredService<IRequiredActor<HistorianAdapterActorKey>>();
|
var historian = host.Services.GetRequiredService<IRequiredActor<HistorianAdapterActorKey>>();
|
||||||
var mux = host.Services.GetRequiredService<IRequiredActor<DependencyMuxActorKey>>();
|
var mux = host.Services.GetRequiredService<IRequiredActor<DependencyMuxActorKey>>();
|
||||||
var publish = host.Services.GetRequiredService<IRequiredActor<OpcUaPublishActorKey>>();
|
var publish = host.Services.GetRequiredService<IRequiredActor<OpcUaPublishActorKey>>();
|
||||||
|
var peerProbes = host.Services.GetRequiredService<IRequiredActor<PeerProbeSupervisorKey>>();
|
||||||
|
|
||||||
driverHost.ActorRef.ShouldNotBeNull();
|
driverHost.ActorRef.ShouldNotBeNull();
|
||||||
dbHealth.ActorRef.ShouldNotBeNull();
|
dbHealth.ActorRef.ShouldNotBeNull();
|
||||||
historian.ActorRef.ShouldNotBeNull();
|
historian.ActorRef.ShouldNotBeNull();
|
||||||
mux.ActorRef.ShouldNotBeNull();
|
mux.ActorRef.ShouldNotBeNull();
|
||||||
publish.ActorRef.ShouldNotBeNull();
|
publish.ActorRef.ShouldNotBeNull();
|
||||||
|
peerProbes.ActorRef.ShouldNotBeNull();
|
||||||
driverHost.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.DriverHostActorName);
|
driverHost.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.DriverHostActorName);
|
||||||
dbHealth.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.DbHealthProbeActorName);
|
dbHealth.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.DbHealthProbeActorName);
|
||||||
historian.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.HistorianAdapterActorName);
|
historian.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.HistorianAdapterActorName);
|
||||||
mux.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.DependencyMuxActorName);
|
mux.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.DependencyMuxActorName);
|
||||||
publish.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.OpcUaPublishActorName);
|
publish.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.OpcUaPublishActorName);
|
||||||
|
peerProbes.ActorRef.Path.Name.ShouldBe(ServiceCollectionExtensions.PeerProbeSupervisorName);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user