【问题标题】:Locally cached stateManager... any risk in Service Fabric?本地缓存的 stateManager ... Service Fabric 中的任何风险?
【发布时间】:2019-07-08 16:56:31
【问题描述】:

在 Service Fabric 中看似常见的做法可能是错误的做法。我怀疑以下将 stateManager 保存为本地缓存的代码在“SomeService”有状态服务中的“CreateServiceReplicaListeners()”方法的返回语句中实例化“Startup”类时可能会导致潜在问题。

可能发生的情况是状态管理器以某种方式重新实例化。我需要更多解释以下做法是否正确。如果不是,那么最好的做法是什么?

internal class SomeService : StatefulService
{
    protected  override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
    {
        return new[]{
            new ServiceReplicaListener(
                        initParams =>
                            new OwinCommunicationListener("SomeService", new Startup(this.StateManager), initParams))
                };
        }
    }
}

public class Startup : IOwinAppBuilder
{
    private readonly IReliableStateManager stateManager;

    public Startup(IReliableStateManager stateManager)
    {
        this.stateManager = stateManager;
    }

    public void Configuration(IAppBuilder appBuilder)
    {
        // other initialization codes..
        ...
        ...

        UnityConfig.RegisterComponents(config, this.stateManager);

        appBuilder.UseWebApi(config);
    }
}

【问题讨论】:

  • 你能不能问一下。您是在问将IReliableStateManager 传递给启动是否OK 或者您在这样做时收到了异常或未定义的行为?

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


【解决方案1】:

每当一个有状态服务改变角色时,它都会触发一个IStatefulServiceReplica.ChangeRoleAsync(ReplicaRole newRole, CancellationToken cancellationToken)

ChangeRoleAsync(..) 确保新角色使用正确的通信执行以下操作:

  • 致电CloseCommunicationListenersAsync(CancellationToken cancellationToken) 关闭所有打开的监听器
  • PrimaryActiveSecondary 角色致电 OpenCommunicationListenersAsync(newRole, cancellationToken)
  • 方法 OpenCommunicationListenersAsync() 将调用 CreateServiceReplicaListeners() 来获取监听器并为每个返回的监听器调用 CreateCommunicationListener(serviceContext) 以打开相关端点。

角色更改在升级和负载平衡期间非常常见,因此这是一个非常常见的事件。

总之,

每次发生角色变更时,都会调用CreateServiceReplicaListeners()ChangeRole不会关闭服务,因此可能会产生副作用,例如,如果您在 DI 容器中注册依赖项,您可能会面临重复注册。

【讨论】:

  • 谢谢,你的意思是这行代码“UnityConfig.RegisterComponents(config, this.stateManager);”如果我理解正确,可能包含 stateManager 的过时引用。
  • 在调用 CreateServiceReplicaListerns() 的 'OpenCommunicationListenerAsync() 期间,'this.StateManager' 是否仍然有效?由于有状态服务更改角色,恐怕如果 Startup 类中的本地缓存“stateManager”会过时,我们需要新副本..
  • @JP_medevice this.StateManager 的实例将有效(角色更改时不会重新初始化)。
  • AFAIK,StateManager 在服务的生命周期中应该是相同的,如果您遇到任何问题,很可能是因为 StateManager 正在 DI 中注册并与某些东西发生冲突。看看这个问题:stackoverflow.com/a/54197276/484222
猜你喜欢
  • 2017-07-17
  • 2016-12-04
  • 2017-11-25
  • 2016-10-12
  • 2018-04-13
  • 1970-01-01
  • 2016-09-28
  • 2012-01-09
  • 2019-07-24
相关资源
最近更新 更多