在启动期间,StatefulServiceBase.RunAsync在“主要”中多次调用了吗?

时间:2019-03-22 07:46:12

标签: azure-service-fabric service-fabric-stateful

在启动过程中,StatefulServiceBase.RunAsync(CancellationToken)方法是否在Primary中多次调用了?

文档([1]和[2])表示,此方法仅在Primary中被调用,而在启动期间将被调用多少次则无关。

参考文献:
[1] https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicefabric.services.runtime.statefulservicebase.runasync?view=azure-dotnet
[2] https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-lifecycle#stateful-service-startup

1 个答案:

答案 0 :(得分:1)

docs建议:

  

RunAsync方法被实现为处理循环,并且仅当副本副本为具有写入状态的主副本时才会被调用。

但是还不清楚的是,{strong}副本升级到时,RunAsync()不仅在启动时被调用,而且在ChangeRole事件中也被调用>主要

从技术上讲,当副本成为主副本时,它将在启动时被调用一次,并且如果由于某种原因它被ChangeRole事件降级为次要副本,然后又被提升为主副本,则每次取消令牌将被取消以在新呼叫之前传播更改。

因此,总而言之,它通常被调用一次,但不应期望这样做,因为它可能会被多次调用,并且如果其中的逻辑希望始终运行一次,将是一个问题。

另一个常见的问题是,CreateServiceReplicaListeners()也可以多次调用,原因与上述相同,但可能是一个更大的问题,因为辅助副本也调用了CreateServiceReplicaListeners(),一个常见的错误是添加假设只调用一次,则其中的逻辑。

文档herehere显示有关上述方案问题的更多详细信息。

This是上述大多数逻辑的源文件。