【发布时间】:2012-12-06 18:02:21
【问题描述】:
我正在摆弄 azure 提供的用于平衡多个 webrole 之间负载的选项。
我找到了三种可能的方法。
第一种方法是什么都不做,让默认(循环)实现来完成这项工作。
第二种可能性是在 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 }
);
【问题讨论】:
标签: azure load-balancing