我想了解有关在Azure Service Fabric中调用Actors的底层机制的更多技术细节,我很难在网上找到这些细节。 Actor以其单线程范围而闻名,因此,除非其任何方法执行完全完成,否则不允许其他客户端调用它。
更具体地说,我需要知道如果Actor在一个客户端调用发起的工作中停留了一段时间会发生什么情况。其他客户应该等多久才能完成工作?秒,分钟,小时?
答案 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拥有更多信息,总而言之,有两点需要牢记:
- 消息传递是尽力而为。
- 演员可能会从同一客户端收到重复的消息。
这意味着,如果在传递消息时发生短暂故障,即使已传递消息,也会重试,从而导致重复消息。