繁体   English   中英

如何在部署在不同群集节点上的两个相同参与者之间保持状态? (akka.net)

[英]How do I persist states between two same actors deployed on different cluster node? (akka.net)

如果我有如下所示的设置,那么说我将有3个节点加入集群,并且我使用了循环池。

var worker = cluster.ActorOf(Props.Create<Worker>().WithRouter(
                 new ClusterRouterPool(
                     new RoundRobinPool(5),
                     new ClusterRouterPoolSettings(30, true, 1))), "worker");

“工作者”只记得它已经处理了多少条消息,如下所示

public class Worker : TypedActor, IHandle<int> {
readonly List<int> processed;

public Worker()
{
    processed = new List<int>();
}

public void Handle(int message)
{
    System.Threading.Thread.Sleep(new Random().Next(1000, 2000));
    processed.Add(message);
    Console.WriteLine("WORKER ({0}) [{1}:{2}], processed: {3}", message, Context.Self.Path, Cluster.Get(Context.System).SelfUniqueAddress.Address.Port, processed.Count);
}

无论如何,是否需要在不同群集节点上的不同参与者之间同步“已处理列表”? 这是akka.net.cluster.sharding最终会做的事情吗? 还是我在做完全没有意义的事情?

一般你的问题似乎是最接近于JVM阿卡落空DDATA插件提供。 在每种情况下,如果让参与者在同一条数据上进行操作,通常会产生副作用,即最终的一致性-由于您的状态是“在多台计算机上工作的许多参与者之间共享的”状态,因此在特定时间点的实际状态可能会模糊视您所采取的演员角度而定。

目前,您还没有听说过.NET平台上有任何成品可以投入生产的选项,但是目前正在开发中的Akka.DistributedData可以让您完成任务。 这是CRDT的Akka实现。

CRDT将为您提供访问最终一致的数据类型的权限,这些数据类型可以在整个应用程序的总体状态简洁的情况下,通过分布式集群中的不同节点进行复制。 在这种情况下,您可以将processed列表替换为GSet ,这将允许您以分布式方式将元素附加到一个数据集。

如果您不想等待,冒险或自行构建CRDT,则可以使用Riak之类的第三方解决方案

PS: Akka.Cluster.Sharding的目的不同,它是自动在群集上均匀分布Actor(即使节点数发生变化),以便在当前群集范围内仅存在一个特定actor实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM