2017-05-09 62 views
4

每当我从另一个呼叫一个服务结构服务时,代理上的第一个呼叫非常慢,即比所有后续呼叫慢100倍。我已经把时间记录在电话前的那个时间,然后立刻调用服务方法,这很容易超过60秒!服务架构群集是运行在12个节点/虚拟机上的独立群集。ServiceFabric代理的初始呼叫非常慢

有趣的是,第一次调用的时间长度似乎与节点的数量有关,即如果我停用一半节点,则时间减少(尽管不是一半)。另外,当在本地PC上运行的开发集群上运行完全相同的代码时,第一次呼叫的时间长度通常约为8秒,随后的呼叫在任一系统上都会花费< 10毫秒。此外,在同一客户端进程中为同一服务创建另一个代理仍然会导致快速的通话时间,看起来好像代理工厂(我相信SF按每个客户端进程缓存)是在首次使用代理时创建的,很长时间。

有趣的是,没有任何例外情况发生,而且服务真正起作用!

所以我的问题是,为什么第一次在使用ServiceProxy.Create()创建的代理上从一个服务调用另一个服务需要很长时间?

回答

1

我没有遇到缓慢的解决方案,无论你有什么附近,但是当我的API服务启动使用依赖注入时,我创建了我的代理。

我的系统设置方式是无状态API服务(asp.net核心)与后端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/ 
    } 
3

根据The SF remoting docs(见下文,重点煤矿),ServiceProxy.Create是围绕ServiceProxyFactory的包装,并在第一次调用还包括设置在工厂的后续调用。

ServiceProxyFactory是一个为不同远程接口创建代理的工厂。 如果您使用API​​ ServiceProxy.Create创建代理,那么框架将创建单例ServiceProxyFactory。当您需要重写IServiceRemotingClientFactory属性时,手动创建一个会很有用。工厂是一个昂贵的操作。 ServiceProxyFactory维护通信客户端的缓存。最佳实践是尽可能缓存ServiceProxyFactory。