私は複数のウェブロール間の負荷のバランスをとるためにazureが提供するオプションを試していました。なぜRoleEnvironment.StatusCheckイベントを購読するのではなく、LoadBalancerProbeを使用する必要がありますか?
これを行う方法は3つあります。
最初は何もしないで、デフォルトの(ラウンドロビン)実装を行うようにします。
2番目の可能性は、ServiceDefinitionFileにカスタムLoadBalancerProbeを定義することです。これは試しても動作しませんでした。私の理解から、カスタムのaspxページは、その役割に対してステータスチェックが実行されるたびに呼び出されます。 HTTPレスポンスコードに応じて、ロールのステータスはビジー状態に変わります。しかし、これは決して起こっていません。 また、私は実際にカスタムLoadBalancingProbeを定義するための例を見つけることができませんでした。
私はこれを行うための代替方法を探しました。
ここでiamはRoleEnvironment.StatusCheckイベントに登録しています。これにより、いくつかのロジックを実装することができ、結果に応じて、役割の状態をビジー状態と使用可能状態に設定します。
私の質問1)カスタムLoadBalancerProbeがMSDNの説明どおりに動作すると仮定すると、StatusCheckEventの購読とカスタムプローブの使用の違いは何ですか?
2)カスタムロードバランサプローブが機能しないのはなぜですか? iamは、現在のところAzureエミュレータでテストしていますが、トラフィックはまだエミュレータでビジー状態に設定されているにも関わらず、Webroleインスタンスにルーティングされていることを十分に認識しています。 しかし、私のカスタムプローブはwebroleinstancesのステータスをまったく変更しません。
私の知る限り、webrole instance_n_0のステータスをビジー状態に設定する必要があります。
public class LoadBalanceController : Controller
{
public ActionResult Index()
{
WebOperationContext woc = WebOperationContext.Current;
if(RoleEnvironment.CurrentRoleInstance.Id.ToLower().Contains("_0"))
{
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.ServiceUnavailable;
}else
{
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
}
return View(); //not relevant
}
アイブ氏はまた私のservicedefinitionfileをconfigeredとカスタムプローブで定義されたhealthcheck.aspxを呼び出すときに、このコントローラ/アクションにリダイレクトするようにルートを設定します。
<LoadBalancerProbes>
<LoadBalancerProbe name="WebRoleBalancerProbeHttp" protocol="http" path="healthcheck.aspx" intervalInSeconds="5" timeoutInSeconds="100"/>
</LoadBalancerProbes>
...
<InputEndpoint name="EndpointWeb" protocol="http" port="80" loadBalancerProbe="WebRoleBalancerProbeHttp"/>
ルート:
routes.MapRoute(
name: "HealhCheck",
url: "healthcheck.aspx",
defaults: new { controller = "LoadBalance", action = "Index", id = UrlParameter.Optional }
);