本地缓存的 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 容器中注册依赖项,您可能会面临重复注册。
在 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()
将调用CreateServiceReplicaListeners()
获取监听器并调用CreateCommunicationListener(serviceContext)
为每个返回的侦听器打开相关端点。
OpenCommunicationListenersAsync(newRole, cancellationToken)
]
角色更改在升级和负载平衡期间很常见,因此这是一个非常常见的事件。
总而言之,
每次发生角色更改时,都会调用 CreateServiceReplicaListeners()
,ChangeRole 不会关闭服务,因此它可能会产生副作用,例如,如果您在 DI 容器中注册依赖项,您可能会面临重复注册。