actor-> actor或service-> actor调用的基本机制是什么,它们的可靠性如何?

时间:2019-01-24 19:16:30

标签: azure-service-fabric

我想了解有关在Azure Service Fabric中调用Actors的底层机制的更多技术细节,我很难在网上找到这些细节。 Actor以其单线程范围而闻名,因此,除非其任何方法执行完全完成,否则不允许其他客户端调用它。

更具体地说,我需要知道如果Actor在一个客户端调用发起的工作中停留了一段时间会发生什么情况。其他客户应该等多久才能完成工作?秒,分钟,小时?

  • 是否存在任何超时机制,如果有,是否以某种方式存在 可配置的?
  • 如果actor所在的节点崩溃,会发生什么情况, 客户端会立即收到错误消息,还是ActorProxy以某种方式处理这种情况并将调用重定向到健康节点上新创建的Actor实例?

1 个答案:

答案 0 :(得分:2)

有很多SO答案,其中包含有关参与者机制的详细信息,以及在文档中,我可以为您提供一些建议:

这个问题不能完全回答您的问题,但是我介绍了锁定的原理:Start a thread inside an Azure Service Fabric actor?

  

问:是否有任何超时机制,如果有,它是否可以某种方式配置?

是的,有一个超时时间,我在这里回答:Acquisition of turn based concurrency lock for actor '{actorName}' timed out after {time}

配置文档位于here

  

Q:如果actor所在的节点崩溃,客户端会立即收到错误消息,还是ActorProxy以某种方式处理这种情况并将调用重定向到健康节点上新创建的Actor实例,会发生什么?

通常,当一个副本出现故障时,总会有一个副本可用,当SF将辅助副本提升为主副本时,新请求将开始移至新副本。

关于通信,默认情况下,SF Actor使用.Net Remoting进行通信的方式与可靠服务相同,在here中对此行为进行了很好的描述,总之,如果客户端,它将重试暂时性失败无法连接到服务(Actor),它将重试直到达到连接超时。

  
    
      

来自文档:

             

服务代理处理为其创建的服务分区的所有故障转移异常。如果存在故障转移异常(非瞬态异常),它将重新解析端点,并使用正确的端点重试该调用。重试故障转移异常的次数是不确定的。如果发生临时异常,代理将重试该调用。

    
  

演员docs拥有更多信息,总而言之,有两点需要牢记:

  
    
        
  • 消息传递是尽力而为。
  •     
  • 演员可能会从同一客户端收到重复的消息。
  •     
  

这意味着,如果在传递消息时发生短暂故障,即使已传递消息,也会重试,从而导致重复消息。