在 Akka.net 中记录所有命令和响应的最佳方式是什么?

What is the best way to log all commands and responses in Akka.net?

记录来自 Akka.net 集群的所有命令和响应的最佳方式是什么?记录将由记录器参与者的层次结构处理,但这些记录器将如何接收或拦截各种命令和响应? 我试过使用事件总线来订阅特定的命令,但这似乎并没有像我想的那样工作,因为没有命令被拦截。

在 Akka.NET 中,每个参与者都有自己的消息队列,用于对传入请求进行排序。有几种方法可以做到这一点:

最简单的方法是创建您自己的抽象角色类型,供您系统中的所有其他角色使用,并覆盖其 AroundReceive 方法 - 它可以让您使用任何类型的逻辑包装继承角色接收处理程序你想要:

class AppActor : ActorBase 
{
    protected readonly ILoggingAdapter logger = Context.GetLogger();

    protected override bool AroundReceive(Receive receive, object message) 
    {
        logger.Debug("Incoming request: {0}", message);
        return receive(message);
    }
}

这也意味着,您需要为系统中使用的每个其他 actor 变体创建一个单独的类型,例如接收 actor 或持久 actor。

如果你想要开箱即用的解决方案 - 有一个名为 Phobos 的商业工具,它可以收集你的 actor 系统内所有正在传输的消息的指标,记录它们,甚至追踪它们之间的因果关系( a.k.a.追踪).