如何确保在编译时将消息发送到Akka.net中的正确Actor?

时间:2016-06-03 06:52:22

标签: interface compile-time type-safety akka.net

由于Akka.net系统只返回一个引用(IActorRef)给Actor,你只能通过Tell()和Ask()与Actor交互,其中参数不是强类型的,只是类型为object base ......我脑子里有一些问题。

如何确保在编译时与正确的Actor类型“交谈”? (例如,如果您只在类的构造函数中接收IActorRef而不是具体的接口契约或通过对Actor系统的请求,那么您不知道Actor能够处理该消息) 如何确保Actor属于特定类型以及如何知道您为此类型选择了正确的消息?

即使松耦合很好,它还有比使用“TellAnything”一个对象契约方法(从我的观点来看)优势更多的缺点,而且Microsoft Orleans Grains在我看来更合适,因为你可以拥有一个明确的界面。我是否会错过Akka.net提供的具有严肃合同的功能?

具有明确界面的Microsoft奥尔良:

public interface IHello : Orleans.IGrainWithIntegerKey
{
  Task<string> SayHello(string greeting);
}

public class HelloGrain : Orleans.Grain, IHello
{
  Task<string> SayHello(string greeting)
  {
    return Task.FromResult($"You said: '{greeting}', I say: Hello!");
  }
}

// Get a reference to the IHello grain with id '0'.
var friend = GrainClient.GrainFactory.GetGrain<IHello>(0);

// Send a greeting to the grain and await the response.
Console.WriteLine(await friend.SayHello("Good morning, my friend!"));

Akka.net只抱怨Tell and Ask(带对象参数):

Akka.net中有类似的东西允许明确的合同吗?我知道在Java中使用Akka有代理支持,但Akka.net似乎没有可比性。

MyActorSystem = ActorSystem.Create("MyActorSystem");

// create top-level actors within the actor system
Props consoleWriterProps = Props.Create<ConsoleWriterActor>();
IActorRef consoleWriterActor = MyActorSystem.ActorOf(consoleWriterProps, "consoleWriterActor");

// now you can tell everything to consoleWriterActor at compile time (even though this Actor only understands a specific message)

// begin processing
consoleReaderActor.Tell(ConsoleReaderActor.StartCommand);

如何确保“接口的客户端只使用正确的命令?”

如果Akka.net有这样的话会很好:

Props consoleWriterProps = Props.Create<ConsoleWriterActor>();
IConsoleWriter consoleWriterActor = MyActorSystem.ActorOf<IConsoleWriter>(consoleWriterProps, "consoleWriterActor");

consoleReaderActor.MyExplicitCallThatAllowsOnlyStartCommandType(ConsoleReaderActor.StartCommand);

1 个答案:

答案 0 :(得分:1)

您可以通过Akka.Interfaced使用接口契约,但这会引入下一级别的复杂性和间接性,这可能会导致性能下降,阻止某些更高级的消息传递模式以及您的actor中的动态行为切换。

其他方法是用IActorRef包装它的类型版本,允许您确保只有特定类型的消息可以通过Tell方法传递 - 这正是Akkling的工作方式。