本地缓存的 stateManager ... Service Fabric 有任何风险吗?

Locally cached stateManager... any risk in Service Fabric?

在 Service Fabric 中看似常见的做法可能是错误的做法。我怀疑当 'Startup' class 在 [=17 中的 'CreateServiceReplicaListeners()' 方法的 return 语句中实例化时,以下将 stateManager 保存为本地缓存的代码可能会导致潜在问题=] 有状态服务。

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

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);
    }
}

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

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

  • 调用 CloseCommunicationListenersAsync(CancellationToken cancellationToken) 关闭任何打开的侦听器
  • 主要ActiveSecondary 角色
  • 调用 OpenCommunicationListenersAsync(newRole, cancellationToken) ]
  • 方法OpenCommunicationListenersAsync()将调用CreateServiceReplicaListeners()获取监听器并调用CreateCommunicationListener(serviceContext)为每个返回的侦听器打开相关端点。

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

总而言之,

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