我正在摆弄 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
}
当调用自定义探针中定义的 healthcheck.aspx 时,我还配置了我的 servicedefinitionfile 并设置了一个路由以重定向到此控制器/操作。
<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 }
);