为什么 ServiceRuntime.RegisterServiceAsync 在 serviceFactory 函数完成之前返回?

Nem*_*mmy 0 azure-service-fabric

我发现 ServiceRuntime.RegisterServiceAsync服务实际注册之前返回并且作为参数传递的工厂 Func 完成之前返回非常不直观。

考虑一下您需要解析正在注册的相同 ServiceName 的场景。你只能从serviceFactory Func中获取的ServiceContext中获取ServiceName。您可能认为一旦获得上下文就可以在 serviceFactory Func 中进行解析。但随后您会进入“死锁”,解析调用将永远陷入困境,因为它等待您正在注册的服务完成。

这就是为什么我期望 RegisterServiceAsync 仅在 serviceFactory Func 完成后才能完成。

Die*_*des 5

它在方法运行之前返回,因为它ServiceRuntime.RegisterServiceAsync()是工厂注册,而不是构建服务的构造函数。

签名:

public Task RegisterStatefulServiceFactoryAsync(string serviceTypeName, IStatefulServiceFactory factory, TimeSpan timeout, CancellationToken cancellationToken)

这里的概念是告诉运行时,每当运行时需要启动 的实例时,serviceTypeName它都应该调用factory Func<System.Fabric.StatefulServiceContext,Microsoft.ServiceFabric.Services.Runtime.StatefulServiceBase>. 该工厂负责设置该服务所需的依赖项,如果您需要进行依赖项注入,您可以在此时进行。

运行时在开始构建服务之前首先需要注册依赖项。与添加依赖项注册时在 ASPNET 上执行的操作非常相似,一旦注册了所有依赖项,您就可以调用Start().

稍后,运行时将准备就绪,并将接收来自 SF 的指令,以从特定服务类型启动实际服务实例,此时将调用这些工厂并构建上下文。如果您在实际收到呼叫之前需要知道 serviceTypeName ,那么这将是先有鸡还是先有蛋的困境。

它以这种方式工作,因为您可以在同一主机上运行多个副本,因此每个实例都将拥有自己的上下文。您还可以在同一主机上拥有多个服务类型。