2017-12-27 10 views
1

Azureサービスファブリッククラスタ上で実行されている名前付きアプリケーションがあるとします。この名前付きアプリケーションには5つの異なるサービスがあります。Azureサービスファブリックは、すべてのサービスに対して個別のプロセスを作成しますか?

これらのサービスは異なるプロセスまたは同じプロセスで実行されますか?これらのサービスが.netサービスではなく、実行可能である場合はどうなりますか?

答えて

2

ゲストEXEは常に独自のプロセスを取得します。

そうでない場合は、利用可能な2つのホスティングのモードがあります。

排他処理 - この1つは非常に単純明快ですそれでは、ここから始めましょうが。このモードでは、すべてが独自のプロセスを取得します。すべてのアプリケーションのすべてのサービスインスタンスのすべてのパーティションのすべてのレプリカは、独自の排他的なホストプロセスを取得します。これは私の推奨するホスティングモードです。なぜなら、これは最も簡単で、通常、デバッグがはるかに容易な安定性とサービスがますます多くなります。

共有プロセス - これはもう少し複雑になります。 アプリケーションインスタンス内では、すべて同じサービスタイプのすべてがホストプロセスを共有します。したがって、たとえば、あなたは一つのアプリケーション持っているとしましょう:

fabric:/myapp 

そして、そのアプリケーションでは、次の2つのサービスタイプを持っている:

service-type-1 (stateful) 
service-type-2 (stateless) 

さて、あなたは5つのパーティションでservice-type-1のインスタンスを作成しましょうとパーティションあたり3つのレプリカ:

fabric:/myapp/mystateFULservice1 (service-type-1) 

これは15個のレプリカを提供します。 5ノードのクラスタでは、Service Fabricはデフォルトで物事を均等に分散するため、各ノードに3つのレプリカが表示されます。共有ホストプロセスモデルでは、各ノードの3つのレプリカがホストプロセスを共有します。そのホストプロセス内で、各レプリカは、StatefulServiceから派生したクラスのインスタンスです。すぐに、これがどのように複雑になるかを見ることができます。私たちはレプリカを表すためにC#の構造体を使用しています。各レプリカはC#オブジェクトです。つまり、彼らはプロセスを共有し、スペースやすべてを共有します。それらのレプリカの1つが未処理の例外をスローし、プロセスをクラッシュさせた場合、他のレプリカはそれに追いつきます。静的変数の使用については忘れてください!

今=あなたが数えるインスタンスとservice-type-2のインスタンスを作成しましょう-1:

fabric:/myapp/mystateLESSservice1 

これは、異なるサービスタイプですので、それは独自のホストプロセスを取得します、最初のサービス私たちとは別それは文字通り異なるコード/ DLLを実行しているためです。これはステートレスなので、このサービスインスタンス(fabric:/ myapp/mystateLESSservice1)ではノードごとに1つのレプリカしか取得できません。

今、あなたはservice-type-2のインスタンスを作成した場合、また、インスタンスでカウント= -1:

fabric:/myapp/mystateLESSservice2 

そのサービスインスタンスが用まで、すでにのホストプロセスを使用しますので、同じサービスタイプだこと同じコード/ DLLを実行しているため、そのタイプの前回のインスタンスです。これは、ステートフルな例で見たものに似ています。各サービスインスタンスは実際にはStatelessServiceから派生したクラスのインスタンスに過ぎません。もちろん、これにはすべて同じ問題があります。

あなたは全く新しいアプリケーションインスタンス作成した場合は最後に、:

fabric:/myapp2 

をあなたは、そのアプリケーション内のすべてのためのプロセスの全体の新しいセットを取得します。したがって、アプリケーションインスタンスは常にプロセス境界です。

tl; dr:排他プロセスを使用します。

+0

単一のノードでサービスのインスタンスを1つしか実行できないため、ステートレスサービスに該当するかどうかはわかりません。したがって、同じサービスの複数のインスタンスを実行することはできません。同じプロセスを共有する必要はありません。 – Pragmatic

+0

用語は少し混乱しています。 "サービスインスタンス"は、createコマンド( "sfctl service create"またはNew-ServiceFabricService)を呼び出すときに得られるものです。サービスインスタンスにはURIの形式で固有の名前があります(例: "fabric:/ app/myservice1")。これらのインスタンスは、同じサービスタイプ(つまり、すべて同じコードを実行している)からいくつでも作成できます。これらのインスタンスは、実際には同じノードにあり、ホストプロセスを共有できます。ステートレスサービスには混乱して「InstanceCount」もあります。実際には「このサービスインスタンスを実行するノードの数は何ですか?」という意味です。 –

関連する問題