azure-service-fabric - 为什么 ServiceRuntime.RegisterServiceAsync 在 serviceFactory 函数完成之前返回?
问题描述
我发现ServiceRuntime.RegisterServiceAsync在服务实际注册并且作为参数传递的工厂 Func 完成之前返回非常不直观。
考虑一下您需要解析您正在注册的同一个 ServiceName 的场景。您只能从您在 serviceFactory Func 中获得的 ServiceContext 中获取 ServiceName。一旦获得上下文,您会认为可以在 serviceFactory Func 中解决。但是随后您进入了一个“死锁”,其中 resolve 调用将永远卡住,因为它等待您注册的服务完成。
这就是为什么我希望 RegisterServiceAsync 也只有在 serviceFactory Func 完成后才能完成。
解决方案
它在方法运行之前返回,因为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 ,那将是先有鸡还是先有蛋的困境。
它以这种方式工作,因为您可以在同一主机上运行多个副本,因此每个实例都有自己的上下文。您还可以在同一主机上拥有多个 serviceType。
推荐阅读
- docker - Airflow how to mount airflow.cfg in docker container
- python - Time difference in microseconds not working as expected
- amazon-web-services - Route 53 地理 DNS 的工作原理是什么?
- javascript - 引用变量被视为未使用和未定义。为什么?
- ruby - Rspec 显示未定义的方法,但对象在同一块中可用
- hashmap - HashMap return the lasted record if it has multiple records with the same key, but different value
- javascript - script triggers owner case when triggerd by editor
- javascript - Move existing DIV to dynamically created iFrame no jQuery
- swift - I get this error " Use of unresolved identifier 'countElement'". I am new to swift, so I cant figure whats wrong
- python-3.x - rasa-core 操作仅返回空数组