Azure service fabric 本地缓存的状态管理器。。。服务织物有风险吗?
在服务结构中,似乎只是常见的做法可能是错误的。我怀疑以下将stateManager保存为本地缓存的代码可能会在“SomeService”有状态服务中的“CreateServiceReplicaListeners()”方法的返回语句中实例化“Startup”类时引发潜在问题 可能发生的情况是状态管理器以某种方式重新实例化。我需要更多的解释,看看下面的做法是否正确。如果不是,那么最好的做法是什么Azure service fabric 本地缓存的状态管理器。。。服务织物有风险吗?,azure-service-fabric,service-fabric-stateful,Azure Service Fabric,Service Fabric Stateful,在服务结构中,似乎只是常见的做法可能是错误的。我怀疑以下将stateManager保存为本地缓存的代码可能会在“SomeService”有状态服务中的“CreateServiceReplicaListeners()”方法的返回语句中实例化“Startup”类时引发潜在问题 可能发生的情况是状态管理器以某种方式重新实例化。我需要更多的解释,看看下面的做法是否正确。如果不是,那么最好的做法是什么 internal class SomeService : StatefulService { p
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);
}
}
内部类SomeService:StatefulService
{
受保护的重写IEnumerable CreateServiceReplicaListeners()
{
返回新的[]{
新ServiceReplicaListener(
initParams=>
新的OwinCommunicationListener(“SomeService”、新启动(this.StateManager)、initParams))
};
}
}
}
公共类启动:IOwinAppBuilder
{
私有只读IReliableStateManager stateManager;
公共启动(IReliableStateManager stateManager)
{
this.stateManager=stateManager;
}
公共无效配置(IAppBuilder appBuilder)
{
//其他初始化代码。。
...
...
UnityConfig.RegisterComponents(配置,this.stateManager);
appBuilder.UseWebApi(配置);
}
}
每当有状态服务更改角色时,它都会触发一个IStatefulServiceReplica.ChangeRoleAsync(ReplicaRole newRole,CancellationToken CancellationToken)
ChangeRoleAsync(..)
确保新角色使用正确的通信,并执行以下操作:
- 调用
关闭所有打开的侦听器CloseCommunicationListenerAsync(CancellationToken CancellationToken)
- 调用OpenCommunicationListenersAsync(newRole,cancellationToken)获取主要或活动次要角色
- 方法
将调用OpenCommunicationListenerAsync()
获取侦听器,并为每个返回的侦听器调用CreateServiceReplicaListeners()
,以打开相关端点CreateCommunicationListener(serviceContext)
CreateServiceReplicaListeners()
,ChangeRole不会关闭服务,因此可能会产生副作用,例如,如果在DI容器中注册依赖项,您可能会面临重复注册。每当有状态服务更改角色时,它就会触发一个IStatefulServiceReplica.ChangeRoleAsync(ReplicaRole newRole,CancellationToken CancellationToken)
ChangeRoleAsync(..)
确保新角色使用正确的通信,并执行以下操作:
- 调用
关闭所有打开的侦听器CloseCommunicationListenerAsync(CancellationToken CancellationToken)
- 调用OpenCommunicationListenersAsync(newRole,cancellationToken)获取主要或活动次要角色
- 方法
将调用OpenCommunicationListenerAsync()
获取侦听器,并为每个返回的侦听器调用CreateServiceReplicaListeners()
,以打开相关端点CreateCommunicationListener(serviceContext)
每次角色发生更改时,都会调用
CreateServiceReplicaListeners()
,ChangeRole不会关闭服务,因此可能会产生副作用,例如,如果您在DI容器中注册依赖项,您可能会面临重复注册。能否回答您的问题。您是在问将IReliableStateManager
传递到startup中是否正常,还是在执行此操作时收到异常或未定义的行为?请稍微回答一下您的问题。您是在询问将IReliableStateManager
传递到startup中是否正常,还是在执行此操作时收到异常或未定义的行为?谢谢,您的意思是这行代码“UnityConfig.RegisterComponents(config,this.stateManager);”如果我理解正确,可能包含stateManager的过时引用。在调用CreateServiceReplicaListerns()的“OpenCommunicationListenarSync()过程中,“this.stateManager”是否仍然有效?由于有状态服务更改角色,我担心如果Startup类中的本地缓存“stateManager”过时,我们需要新的副本。@JP\u medevicethis.stateManager
的实例将有效(角色更改时不会重新初始化)。好的,stateManager在服务的生命周期内应该是相同的,如果您面临任何问题,可能是因为StateManager正在DI中注册,并且与某些内容冲突。请看一下这个问题。斯通:谢谢,你是说这行代码“UnityConfig.RegisterComponents(config,this.stateManager);”可能包含stateManager的过时引用,如果我理解正确的话。在调用CreateServiceReplicaListerns()的“OpenCommunicationListenarSync()期间,“this.StateManager”是否仍然有效?由于有状态服务更改角色,我担心如果Startup类中的本地缓存“stateManager”过时,我们需要新的副本。@JP\u medevicethis.stateManager
的实例将有效(角色更改时不会重新初始化)。好的,stateManager在服务的生命周期内应该是相同的,如果您面临任何问题,可能是因为StateManager正在DI中注册,并且与某些内容冲突。看看这个克斯顿: