【问题标题】:StatefulServiceBase.RunAsync called more than once in Primary during startup?启动期间在 Primary 中多次调用 StatefulServiceBase.RunAsync?
【发布时间】:2019-08-13 04:01:27
【问题描述】:

在启动期间是否在 Primary 中多次调用 StatefulServiceBase.RunAsync(CancellationToken) 方法?

文档 ([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

【问题讨论】:

  • 调用一次。

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


【解决方案1】:

docs 建议:

RunAsync 方法被实现为一个处理循环,并且只会在副本是具有写入状态的主副本时调用。

但不清楚的是 RunAsync() 不仅在启动时被调用,当 Secondary 副本提升为 Primary强>。

从技术上讲,它在副本成为主副本时在启动时调用一次,如果由于任何原因它被ChangeRole事件降级为辅助,然后再次提升为主,它将再次调用,每次取消令牌将被取消以在新调用之前传播更改。

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

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

文档herehere 显示了有关上述场景问题的更多详细信息。

This 是上述大部分逻辑的源文件。

【讨论】:

  • 不错的答案!我只有一个小小的补充。这些文档不是 100% 准确的(这里是 GitHub 上statefulstateless 服务的问题)。在更新文档之前,您可以使用 Service Fabric Handbook 博客文章中的生命周期部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多