为啥我应该使用 LoadBalancerProbe 而不是订阅 RoleEnvironment.StatusCheck 事件?

Posted

技术标签:

【中文标题】为啥我应该使用 LoadBalancerProbe 而不是订阅 RoleEnvironment.StatusCheck 事件?【英文标题】:Why should i use a LoadBalancerProbe instead of subscribing to the RoleEnvironment.StatusCheck Event?为什么我应该使用 LoadBalancerProbe 而不是订阅 RoleEnvironment.StatusCheck 事件? 【发布时间】: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 

        );

【问题讨论】:

【参考方案1】:

不确定为什么自定义探测不起作用,但区别在于:运行状况检查事件可让您宣布实例是否可用,但在调用频率方面您没有任何灵活性。此外,您不能启动侦听自定义端口(或端口类型)的单独服务。

您可以使用自定义探针获得更大的灵活性,因为您可以创建任何类型的端口侦听器来确定运行状况,甚至是单独的 exe。

对于虚拟机,这是运行状况探测的唯一方法,因为虚拟机不运行来宾代理,也不提供运行状况检查事件。

【讨论】:

【参考方案2】:

在您的服务定义文件中,您已将探测标记为托管在 http 端点(而不是 HTTPS)上。

您的网络应用程序也是这样吗?它是否在 HTTP 而不是 HTTPS 上公开该端点?如果是,那么还要检查是否有任何自动重定向到 HTTPS 发生。

我认为您已经正确设置了所有内容。 Here 是一个帖子,其中包含一些示例代码和另一个 question from SO,他们成功地设置了它(应该提供对 csdef 文件的一些见解)。

我同意 David Makogon 关于两者之间差异的观点。

【讨论】:

以上是关于为啥我应该使用 LoadBalancerProbe 而不是订阅 RoleEnvironment.StatusCheck 事件?的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用 createRef 还是 useRef,为啥?

我应该使用 FxCop,为啥?

为啥我不应该使用 Unity?

为啥我应该使用“下一个/图像”?

为啥我应该使用 Validators.compose()?

为啥我应该使用 UIToolbar 与使用 UIView?