Azure service fabric 多个参与者之间的并发性

Azure service fabric 多个参与者之间的并发性,azure-service-fabric,actor,Azure Service Fabric,Actor,如果参与者a调用参与者b和参与者c上的方法,会发生什么 Task CallBAndC() { IActorB b=ActorProxy.Create(ActorId.CreateRandom(),新Uri(“fabric://MyApp/MyService")); IActorC c=ActorProxy.Create(ActorId.CreateRandom(),新Uri(“fabric://MyApp/MyService")); 任务未来结果=b.方法(); 任务未来结果=c.方法(); /

如果参与者a调用参与者b和参与者c上的方法,会发生什么

Task CallBAndC()
{
IActorB b=ActorProxy.Create(ActorId.CreateRandom(),新Uri(“fabric://MyApp/MyService"));
IActorC c=ActorProxy.Create(ActorId.CreateRandom(),新Uri(“fabric://MyApp/MyService"));
任务未来结果=b.方法();
任务未来结果=c.方法();
//做一些冗长的计算
返回(等待未来结果)+(等待未来结果);
}
“b.Method()”和“c.Method()”能否同时运行?或者它们是按顺序运行的(可能是由于处于Actor a的调用上下文中)?
当“b.Method()”和“c.Method()”调用a的方法时会发生什么?

这种方法应该没问题,只需要记住几个注意事项:

  • 您应该始终等待参与者调用返回的任务,如果您触发并忘记可能会丢失调用,因为无法保证消息已传递

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

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

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);
}