7

Azure で wcf サービスをホストしたいのですが、このインスタンス化は動的でなければならないため、必要に応じて新しいサービスをインスタンス化したいのですが...

new ServiceHost(new Service(),<<What the heck is the base URI!?>>)

以下のベース Uri (スキーム、サーバー名、ポート) は次のとおりです。

  1. ワーカーの役割
  2. Web ロール
    • 外部エンドポイント
    • 内部エンドポイント。(一部のサービスは、パフォーマンス上の理由から、ロード バランサーの背後で相互に通信する必要がありますが、どのように?)

これらも可能ですか:

  1. Web ロールごとに複数のサービス ホスト。
  2. さまざまなエンドポイント バインディング。Http に 1 つの servicehost が必要で、別の Net.tcp が必要な場合は、展開時に csdef ファイルで両方のプロトコルを宣言する必要がありますか、または必要に応じてプログラムで追加できますか (別名、レイト バインド)?

$$$ の理由で、ServiceBus を使用しないソリューションを探しています。

4

1 に答える 1

4

Webロールインスタンスでもワーカーロールインスタンスでも、どちらも基本的にWindows 2008 Serverであるため(WebロールでIISが実行されており、いくつかのポートを消費するため)、アプローチは同じです。wcfサービスをハングアップするポートはどれでも、これらを入力エンドポイント(ポートごとに1つのエンドポイント)として定義し、そのエンドポイントを処理する役割も決定します。

使用可能なポートがある限り、複数のServiceHostを使用できます。現在、デプロイメントごとに合計25の入力エンドポイントと合計25の内部エンドポイントに制限されているため、これが絶対的な制限です。もちろん、RDPを有効にすると、使用可能なポート数が減少します。ああ:プロトコルに関して:プロトコルはエンドポイント定義で定義されているので、httpとtcpの両方が必要な場合は、2つのエンドポイントを定義する必要があります。

内部エンドポイントWCFサービスはほとんど同じですが、セキュリティを廃止し、net.tcpを使用して高速転送を行うことができます。ただし、負荷分散の1つの違いは次のとおりです。

  • 入力エンドポイントにぶら下がっているWCFサービスは、ロールのすべてのインスタンス間で負荷分散されます
  • 内部エンドポイントにハングしているWCFサービスは、負荷分散されません。

後者の場合:Webロールが内部エンドポイント上のワーカーロールのWCFサービスと通信する必要があるとします。すべてのインスタンスを列挙し、それぞれのIP +ポートを取得してから、ランダムに1つ(またはラウンドロビン、または選択した方法)を選択する必要があります。これは、指定されたロールと指定されたエンドポイント名(Michael Washamのブログから借用したコード)からランダムなエンドポイントインスタンスを返すサンプルメソッドです。

private String GetRandomServiceIP(String roleName, String endPointName)
{
    var endpoints = RoleEnvironment.Roles[roleName].Instances.Select(i => i.InstanceEndpoints[endPointName]).ToArray();
    var r = new Random(DateTime.Now.Millisecond);
    int ipIndex = r.Next(endpoints.Count());
    return endpoints[ipIndex].IPEndpoint.Address.ToString();
}

WCFサービスと関連するURIのセットアップに関しては、最新のWindows Azureトレーニングキットを入手し、ServiceHostのセットアップについて詳しく説明しているWorkerRoleCommunicationハンズオンラボをウォークスルーすることを強くお勧めします。入力エンドポイントと内部エンドポイント。

于 2012-05-25T03:07:32.967 に答える