多个参与者之间的并发

时间:2018-12-20 20:26:18

标签: azure-service-fabric actor

如果Actor a 在Actor b 和Actor c 上调用方法会发生什么?

Task<int> CallBAndC()
{
      IActorB b = ActorProxy.Create<IActorB>(ActorId.CreateRandom(), new Uri("fabric://MyApp/MyService"));
      IActorC c = ActorProxy.Create<IActorC>(ActorId.CreateRandom(), new Uri("fabric://MyApp/MyService"));
      Task<int> futureBResult = b.Method();
      Task<int> futureCResult = c.Method();

      // do some lengthy computation

      return (await futureBResult) + (await futureCResult);
}

'b.Method()'和'c.Method()'是否可以同时运行?还是它们按顺序运行(也许是由于位于Actor a 的调用上下文中)? 当'b.Method()'和'c.Method()'调用 a 方法时会发生什么?

1 个答案:

答案 0 :(得分:1)

这种方法应该可以,请注意以下几点:

  • 您应该始终等待actor调用返回的任务,如果您开除并忘记了您可能会丢失该调用,因为无法保证消息已传递。

  • 当一个actor向另一个actor发送呼叫时,它将在队列中等待,直到该actor可以自由处理该呼叫。当调用来自同一上下文时,如果启用了Reentrancy,并且参与者正在等待同一上下文的操作完成,则将允许该调用继续。

    示例:当演员A呼叫演员B,然后B尝试呼叫演员A,而A等待对B的初始调用完成,重入将允许B继续,然后返回从A到B的结果,然后B会将结果返回给A。可以更改此行为,当禁用重入模式时,当B尝试调用A时它将死锁。超时后操作将失败。