Baz*_*Man 5 performance proxy azure-service-fabric
每当我从另一个调用一个服务结构服务时,代理上的第一个调用非常慢,即比所有后续调用慢 100 倍。我已经把时间记录在调用之前的时间,然后是被调用的服务方法中的时间,这很容易超过 60 秒!服务结构集群是在 12 个节点/VM 上运行的独立集群。
有趣的是,第一次调用所需的时间长度似乎与节点数量有关,即如果我停用一半节点,时间就会减少(尽管不是一半)。此外,当在我的本地 PC 上运行的开发集群上运行完全相同的代码时,第一个调用所花费的时间通常约为 8 秒,随后的调用在任一系统上花费 < 10 毫秒。此外,在同一客户端进程中为同一服务创建另一个代理仍然会导致快速调用时间,似乎代理工厂(我相信每个客户端进程的 SF 缓存)是在第一次使用代理时创建的,并采取很长时间。
有趣的是,没有抛出异常,服务实际工作!
所以我的问题是,为什么第一次在使用 ServiceProxy.Create() 创建的代理上从一个服务调用另一个服务需要这么长时间?
我没有经历过与您所拥有的任何地方的缓慢解析,但是当我的 API 服务使用依赖项注入启动时,我创建了我的代理。
我设置系统的方式是无状态 API 服务 (asp.net core) 与后端 SF 服务进行通信。
我实际上可能遇到了更长的延迟,但当我去使用该应用程序时,解决过程已经开始并完成,而不是当我向应用程序发出第一个请求时开始解决。
private void InitializeContainer(IApplicationBuilder app)
{
// Add application presentation components:
Container.RegisterMvcControllers(app);
Container.RegisterMvcViewComponents(app);
// Add application services.
Container.Register(() => ServiceProxy.Create<IContestService>(FabricUrl.ContestService), Lifestyle.Transient);
Container.Register(() => ServiceProxy.Create<IFriendService>(FabricUrl.FriendService), Lifestyle.Transient);
Container.Register(() => ServiceProxy.Create<IUserService>(FabricUrl.UserService), Lifestyle.Transient);
Container.Register(() => ServiceProxy.Create<IBillingService>(FabricUrl.BillingService), Lifestyle.Transient);
Container.RegisterSingleton(AutoMapperApi.Configure());
// Cross-wire ASP.NET services (if any). For instance:
Container.RegisterSingleton(app.ApplicationServices.GetService<ILoggerFactory>());
// NOTE: Prevent cross-wired instances as much as possible.
// See: https://simpleinjector.org/blog/2016/07/
}
Run Code Online (Sandbox Code Playgroud)