Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure service fabric 本地缓存的状态管理器。。。服务织物有风险吗?_Azure Service Fabric_Service Fabric Stateful - Fatal编程技术网

Azure service fabric 本地缓存的状态管理器。。。服务织物有风险吗?

Azure service fabric 本地缓存的状态管理器。。。服务织物有风险吗?,azure-service-fabric,service-fabric-stateful,Azure Service Fabric,Service Fabric Stateful,在服务结构中,似乎只是常见的做法可能是错误的。我怀疑以下将stateManager保存为本地缓存的代码可能会在“SomeService”有状态服务中的“CreateServiceReplicaListeners()”方法的返回语句中实例化“Startup”类时引发潜在问题 可能发生的情况是状态管理器以某种方式重新实例化。我需要更多的解释,看看下面的做法是否正确。如果不是,那么最好的做法是什么 internal class SomeService : StatefulService { p

在服务结构中,似乎只是常见的做法可能是错误的。我怀疑以下将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);
    }
}
内部类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 medevice
this.stateManager
的实例将有效(角色更改时不会重新初始化)。好的,stateManager在服务的生命周期内应该是相同的,如果您面临任何问题,可能是因为StateManager正在DI中注册,并且与某些内容冲突。请看一下这个问题。斯通:谢谢,你是说这行代码“UnityConfig.RegisterComponents(config,this.stateManager);”可能包含stateManager的过时引用,如果我理解正确的话。在调用CreateServiceReplicaListerns()的“OpenCommunicationListenarSync()期间,“this.StateManager”是否仍然有效?由于有状态服务更改角色,我担心如果Startup类中的本地缓存“stateManager”过时,我们需要新的副本。@JP\u medevice
this.stateManager
的实例将有效(角色更改时不会重新初始化)。好的,stateManager在服务的生命周期内应该是相同的,如果您面临任何问题,可能是因为StateManager正在DI中注册,并且与某些内容冲突。看看这个克斯顿: