複数の Web ロール間の負荷を分散するために azure が提供するオプションをいじっていました。
これを行う3つの可能な方法を見つけました。
1 つ目は、何もせずにデフォルト (ラウンド ロビン) の実装に任せることです。
2 番目の可能性は、ServiceDefinitionFile でカスタム LoadBalancerProbe を定義することです。これは、試してみましたが機能しませんでした。私の理解では、ロールでステータス チェックが実行されるたびに、カスタム aspx ページが呼び出されます。http 応答コードに応じて、ロールのステータスがビジーに変わります。-しかし、これは決して起こりません。また、カスタム LoadBalancingProbe を定義するための例を実際に見つけることができませんでした。
したがって、これを行う別の方法を探しました。
ここで、RoleEnvironment.StatusCheck イベントをサブスクライブしています。これにより、いくつかのロジックを実装し、結果に応じてロールの状態をビジーで使用可能に設定できます。
私の質問: 1) カスタム LoadBalancerProbe が MSDN で説明されているように機能すると仮定すると、StatusCheckEvent へのサブスクライブとカスタム プローブの使用の違いは何ですか?
2) カスタム ロード バランサー プローブが機能しないのはなぜですか? - 今のところ 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 を構成し、ルートを設定して、カスタム プローブで定義された 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 }
);