akka.net actor并行执行

akka.net actor parallel execution

我们正在 akka.net 上进行 POC 以处理 json 个文件。我正在努力寻找批处理 JArray 的最佳方法。在我的实现中,akka 协调员收到以下消息:

//coordinator actor receive
public class ValidatedInput
{
public JArray Data { get; set; }
}

我的协调员 actor 可以像下面这样一次性处理完整的 JArray,但我正在努力启动并行 actor 的数量,每个 actor 会处理来自 JArray 的 50 条记录。

//coordinator actor receives messages and calls transform actor to process
public void Receiving()
{
Receive<ValidatedInput>(x =>
{
TransformerRouter.Tell(x);
});
}

//transform actor receives message and process, sample code
Receive<ValidatedInput>(x =>
{
PipeToSupport.PipeTo<TransformResult>(MapDataAsync(x).ContinueWith(data =>
{
return new TransformResult();}), Self);
});

有没有像下面这样的方法可以传递 50 个 JArray 记录供每个演员处理并收集结果,例如:

Receive<ValidatedInputDataResult>(
{
TransformerRouter.Tell(x.Data.Take(50);
});

有一段时间没有使用 Akka.NET,但当我使用时,我总是尽可能避免传递集合,主要有两个原因:

  • 您可以发送给演员的消息大小有限制,尽管可以增加此限制this isn't recommended

  • 发送给参与者的所有消息都被序列化,然后在 Receive<> 时被反序列化,这意味着如果您在消息中发送数组或其他对象集合,您可能会每次使用 Tell 方法时,它们都分配在大对象堆上,如果这是热代码路径,则应尽可能避免这种情况。

我当时处理这类问题的方法是:

  • 有一个 "top level" 协调员 actor:
    • 包含一个路由器,worker actor 位于该路由器后面。例如,您可以将路由器配置为 distribute messages in a round-robin fashion.
    • 每次 Receive 收到新消息时,
    • 都会生成一个 "aggregator" actor,worker actor 会将其结果发送到该 actor。您可以使用 Tell 方法并传递聚合器的参与者引用,以便工作人员在其参与者上下文中将聚合器视为 Sender
  • "top level" 参与者中的路由器配置为 automatically spawn more actors when needed
  • worker actors 只是 Receive 一条消息,对其进行处理,然后 Tell 将其发送到其上下文中的 Sender

请记住,这个建议可能不完整,因为我当时 "fluent" 不太喜欢使用 actor 系统,并且我已经有大约 6 个月没有积极使用 Akka.NET 并且可能会有更好的方法来完成您的需要。

我建议在 Google 上搜索 "actor system patterns" 和 "Scala actor patterns",并阅读一些开源 Scala 项目的源代码,这也会让您有所了解。

最后,避免将来出现麻烦的提示:消息类型应该始终 是不可变的。所以你的 ValidatedInput 应该看起来像这样:

public class ValidatedInput
{
    public readonly JArray Data { get; }

    public ValidatedInput(JArray data)
    {
        Data = data;
    }
}

或者更好:

public class ValidatedInput
{
    public readonly IReadOnlyList<JToken> Data { get; }

    public ValidatedInput(IReadOnlyList<JToken> data)
    {
        Data = data;
    }
}

希望这对您有所帮助,祝您好运!