2017-05-09 11 views
4

私が別のサービスファブリックサービスを呼び出すときはいつでも、プロキシの最初の呼び出しは非常に遅く、つまり後続のすべての呼び出しよりも100倍遅くなります。私はその記録の時間をコールの直前の時刻にしてから、サービスメソッドが呼び出された直後の時刻にしました。これは簡単に60秒以上かかることがあります。サービスファブリッククラスタは、12ノード/ VMで動作するスタンドアロンクラスタです。興味深いことに、最初の呼び出しに要する時間は、ノードの数に関連するように見える。すなわち、ノードの半分を非アクティブにすると、時間は半減するが、時間は短縮される。また、私のローカルPC上で実行されているdevクラスタ上で全く同じコードを実行しているときは、最初の呼び出しの長さは通常約8秒で、その後の呼び出しではいずれのシステムでも<の10msとなります。さらに、同じクライアントプロセス内の同じサービスに別のプロキシを作成すると、呼び出し時間が速くなりますが、プロキシファクトリ(クライアントプロセスごとにSFキャッシュがあると思われます)は、プロキシの最初の使用時に作成され、とても長い間。ServiceFabricプロキシの最初の呼び出しは非常に遅い

興味深いことに、例外はスローされず、サービスは実際に動作します!

私の質問は、なぜ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のラッパーであり、第1コールは、その後の呼び出しのために工場を設定することを含みます。

ServiceProxyFactoryは、さまざまなリモートインターフェイスのプロキシを作成するファクトリです。 API ServiceProxy.Createを使用してプロキシを作成する場合、フレームワークはシングルトンのServiceProxyFactoryを作成します。 IServiceRemotingClientFactoryプロパティをオーバーライドする必要があるときに手動で作成すると便利です。工場は高価な作業です。 ServiceProxyFactoryは、通信クライアントのキャッシュを維持します。ベストプラクティスはServiceProxyFactoryを可能な限りキャッシュすることです。

関連する問題