我已经在接受远程请求并进行处理和发回响应的服务中实现了 Akka.Net 参与者系统。系统中的一些参与者的状态会被持久化到数据库中。当 Actor 系统启动时,这些 Actor 通过从数据库中读取他们的状态来获得水分。
当请求进来时,actor 会根据需要延迟加载并驻留在内存中以处理进一步的请求。
我现在正在研究如何以最简单的方式提供冗余。
我猜这里最简单的解决方案是在“冷”备用服务上有第二个副本。当第一个节点宕机时,请求被路由到第二个节点——然后第二个节点将开始创建角色并从数据库中获取他们的状态。
然后原始节点,当它出现时,需要识别它不是“主要”并终止所有参与者(这样当它变为事件时,它可以从磁盘读取它们的状态)
实现这一目标的最佳方式是什么?
我猜我应该使用 Akka.Cluster 并监听节点何时加入或离开集群?但是我怎么说所有的消息本质上都应该发送到一个节点呢?是否有某种领导人选举过程,但针对个人角色而不是整个集群?
有没有更好/更简单的方法来做到这一点?
最佳答案
我是使用 akka.net 的新手,但我认为您可以使用 Akka.Net Cluster + SingletonActor。我在这里做了一些测试,它似乎工作得很好。
sample :
private void Start() {
var system = ActorSystem.Create("SingletonActorSystem");
var cluster = Cluster.Get(system);
cluster.RegisterOnMemberRemoved(() => MemberRemoved(system));
var actor = system.ActorOf(ClusterSingletonManager.Props(
singletonProps: Props.Create<ProcessorCoordinatorActor>(),
terminationMessage: PoisonPill.Instance,
settings: ClusterSingletonManagerSettings.Create(system)),
name: "processorCoordinator");
Console.ReadLine();
cluster.Leave(cluster.SelfAddress);
_leaveClusterEvent.WaitOne();
}
private async void MemberRemoved(ActorSystem actorSystem) {
await actorSystem.Terminate();
_leaveClusterEvent.Set();
}
配置:
akka {
suppress-json-serializer-warning = on
actor {
provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
}
remote {
helios.tcp {
port = 0
hostname = localhost
}
}
cluster {
auto-down-unreachable-after = 5s
down-removal-margin = 5s
seed-nodes = [ "akka.tcp://SingletonActorSystem@127.0.0.1:4053" ]
roles = [worker]
singleton {
singleton-name = "processorCoordinator"
role = "worker"
hand-over-retry-interval = 5s
}
}
}
关于akka.net - 在 Akka.Net 中处理冗余和故障转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36178712/