Akka 不可序列化的“道具”是反模式吗?

Akka 不可序列化的“道具”是反模式吗?,akka,Akka,例如: 假设我有一个参与者正在管理与某个外部服务的通信,因此它有一个Client对象,用于向外部服务发出请求。为了避免这个参与者变得单一,我可能希望创建子参与者来处理不同的交互:维护服务的心跳、发出和协调复杂的请求等。这些子参与者将需要对服务的客户端的引用 考虑到这些客户端对象不太可能是可序列化的,并且可能是有状态的,例如包含连接状态,通过道具将它们传递给子参与者是否是一种反模式?Akka文档似乎强烈鼓励维护可序列化的道具,但在这种情况下,这似乎是非常有限的 Akka文档似乎强烈鼓励维护可序列化

例如:

假设我有一个参与者正在管理与某个外部服务的通信,因此它有一个
Client
对象,用于向外部服务发出请求。为了避免这个参与者变得单一,我可能希望创建子参与者来处理不同的交互:维护服务的心跳、发出和协调复杂的请求等。这些子参与者将需要对服务的
客户端的引用

考虑到这些客户端对象不太可能是可序列化的,并且可能是有状态的,例如包含连接状态,通过
道具将它们传递给子参与者是否是一种反模式?Akka文档似乎强烈鼓励维护可序列化的道具,但在这种情况下,这似乎是非常有限的

Akka文档似乎强烈鼓励维护可序列化的道具

我不知道这个建议,你介意分享问题中的链接吗

根据我的经验,将这些
Client
引用从父角色传递给子角色是非常常见的。有时,为了便于单元测试,我可能会选择传递精确的方法(函数),而不是
客户机
参考。只要你没有跨越网络边界产生一个演员,我不认为这是件坏事


关于您描述的
客户端
对象,对于网络级别的事情(例如,连接状态等),我将利用它。如果要保留应用程序级别的东西,我更希望有一个单独的参与者专门用于这种用途。在我看来,将应用程序状态保持为非参与者状态听起来有点反模式,前提是您有Akka-actor,它被设计为宿主状态。

要补充Yik的答案,是的,这是非常常见的。唯一需要注意的是,尽量避免儿童对对象进行变异。如果孩子们只是读这些东西,那没关系。如果孩子们需要对它进行变异,你就必须适当地处理并发性,这有点违背了Akka的思想,有人可能会说它的外部服务的“反模式”客户机中往往有一些状态,如线程池、连接等,但这些类自然是线程安全的,“状态”不是业务逻辑状态,而是实现细节。也许没关系吧?我想我读了太多文件了。也许这些年来它们已经改变了,但从最新的文档中我能做的最好的事情就是验证所有道具是否可序列化的配置标志。这么说来,我在文档中找不到一个例子,它们将复杂且明显不可序列化的内容传递到道具中。谢谢你的回答,也许对你来说这似乎是显而易见的,但对我来说,这填补了文档和示例中的空白@tonicsoft通常从简单开始,这可能就是原因。不管怎样,很高兴这有帮助!