2017-09-29 9 views
0

私は2つのサービスでサービスファブリックアプリケーションを構築しました:信頼性の高い辞書にデータを格納し、追加するためのメソッドを公開しAzureのサービス生地:ASP.NETコアステートフルサービスで信頼性の高いコレクションを使用すると、直接

  1. ステートフルデータサービス/辞書からデータ項目を削除/取得する。
  2. 外部へのHTTPインターフェイスとして機能し、リモートサービスを使用してデータサービスと通信し、データを取得してユーザーに表示するステートレスWeb APIサービス。

サービスファブリックにステートフルなWeb APIサービスを作成するための規定があります。私はデータサービスを取り除き、信頼できる辞書をWeb APIサービスでのみ管理しようとしました。しかし、コントローラのStateManagerにアクセスすることができません。私はこれを行うオンラインのサンプルを見つけることができません。

ステートフルなASP.NET Core APIサービスについて私の理解は正しいですか?つまり、信頼できるコレクションを直接使用できますか?

答えて

2

はい - 信頼できるコレクションをasp.netサービスで使用できます。このサンプルはあなたが構築しているものと同じです:https://github.com/Azure-Samples/service-fabric-dotnet-quickstartには、asp.netコアステートフルサービスが含まれています。

主なもの:

  1. あなたのサービスがserviceListenerでMicrosoft.ServiceFabric.Services.Runtime.StatefulService
  2. から派生している、あなたのセットアップServiceReplicaListener(ないServiceInstanceListener)追加WebHostbuilderで
  3. シンプルなIRealibleStatemanager:.AddSingleton(this.StateManager))

これで、コントローラはシングルトンStateMana ger:

public MyDataController(IReliableStateManager stateManager) 
    { 
     this.stateManager = stateManager; 
    } 
3

また、縮尺を変更する必要がある場合は、パーティション分割も検討する必要があります。 その場合、おそらく別のサービスが良いかもしれません。

(そうでもない答えが、私は50点:)の下に居ないので、私はコメントすることはできません)

+0

あなたのポイントは有効です。 1つのサービスには複数の責任がありますが、私もそれについて考える必要があります。ありがとうございました。 – vmn

1

あなたはサービスがすべてのノードで利用できるようにしたい場合は二次レプリカで聞くことができます。

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners(){ 
    return new ServiceReplicaListener[]{ 
     new ServiceReplicaListener(serviceContext => 
      new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) => { 
       EventTracer.Current.LogSystemMessage(serviceContext, $"Starting http kestrel listner on {url}"); 
       return new WebHostBuilder() 
        .UseKestrel() 
        .ConfigureServices(
         services => services 
         .AddSingleton<StatefulServiceContext>(serviceContext) 
         .AddSingleton<IReliableStateManager>(this.StateManager)) 
        .UseContentRoot(Directory.GetCurrentDirectory()) 
        .UseStartup<Startup>() 
        .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None) 
        .UseUrls(url) 
        .Build(); 
      }),"WebService",listenOnSecondary:true) 

    }; 
} 
関連する問題