gpt4 book ai didi

c# - 扩展 Akka.Net

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:55 24 4
gpt4 key购买 nike

我们将 Akka.net 框架用于能源领域的高度扩展应用程序。

我们将 Akka.net 用于各种任务,主要采用以下形式:

var system=ActorSystem.Create("actorSystem");
var props=Props.Create<UpdateActor>();
.WithRouter(new SmallesMailboxPool(100));
var actorRef=system.ActorOf(props,"UpdateActor");
foreach(var timerow in timeRowList)
actorRef.Tell(timerow)

不幸的是,Akka.net 框架在许多情况下的扩展性非常差。CPU负载仅为12%。显然只使用了一个线程或几个线程。

如何配置 Akka.Net 使用多线程来处理 actors?

最佳答案

这是一个有根据的猜测,但如果您正在使用 SmallestMailboxPool,请记住它在非阻塞 I/O 和存储方面的表现非常糟糕。

通常首先要检查是否没有阻塞操作(如同步 I/O,调用 AsyncMethod().ResultThread.Sleep),这将阻塞当前线程,有效地防止它被其他参与者使用。

另一个问题是针对最小邮箱路由器的,它与存储和持久化 actor 相关。

存储

存储是处理多步操作的一种流行方式。这种模式可以表示如下。

  public class MyActor : ActorBase, IWithUnboundedStash
{
public IStash Stash { get; set; }

public Receive Active(State workUnit) => message =>
{
switch(message)
{
case DoWork:
// stash all messages not related to current work
Stash.Stash(message);
return true;
case WorkDone done:
// when current unit of work is done, unstash pending messages
Stash.UnstashAll();
Become(Idle);
return true;
}
};

public bool Idle(object message)
{
switch(message)
{
case DoWork work:
StartWork(work.State);
Become(Active(work.State)); //continue work in new behavior
return true;
default:
return false;
}
}

public bool Receive(object message) => Idle(message);
}

这种情况很常见,即 持久性参与者 在恢复过程中使用它。问题是,它正在清理邮箱,这给 SmallestMailbox 路由器一个错误的感觉,即这个 actor 的邮箱是空的,而实际上它只是隐藏所有传入的消息。

这也是为什么peristent actor 不应该使用SmallestMailbox 路由器 进行路由的原因!说实话。我想不出在任何情况下,将持久性参与者放在任何类型的路由器后面是一个有效的选择。

关于c# - 扩展 Akka.Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53416051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com