我在服务中实现了一个Akka.Net actor系统,该系统接受远程请求并处理并发回响应。系统中的某些参与者具有持久保存到数据库的状态。当演员系统启动时,这些演员通过从数据库中读取他们的状态来获得水分。
当请求进入时,演员会根据需要随意加载并驻留在内存中以处理更多请求。
我现在正在研究如何以最简单的方式提供冗余。
我猜这里最简单的解决方案是在'冷'待机状态下获得服务的第二个副本。当第一个节点发生故障时,请求将被路由到第二个节点 - 然后第二个节点将开始创建actor并从数据库中获取状态。
然后原始节点出现时需要识别它不是'primary'并终止所有actor(因此当它变为活动状态时它可以从磁盘状态读回它们)
实现这一目标的最佳方法是什么? 我猜我应该使用Akka.Cluster并监听节点何时加入或离开集群?但是,我怎么说所有消息应该基本上转到一个节点?是否存在某种领导者选举过程,但是对于个人角色而不是整个群体?
有更好/更简单的方法吗?
答案 0 :(得分:0)
我是使用akka.net的新手,但我认为你可以使用Akka.Net Cluster + SingletonActor。我在这里做了一些测试,看起来效果很好。
<强>示例:强>
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
}
}
}