【问题标题】:Azure Web Role Internal Endpoint - Not Load BalancedAzure Web 角色内部终结点 - 非负载平衡
【发布时间】:2012-09-10 05:21:12
【问题描述】:

Azure 文档说 Web 角色的内部端点不会进行负载平衡。这样做的实际后果是什么?

示例: 我有一个包含 20 个实例的 Web 角色。如果我为该 Web 角色定义了一个内部端点,那么内部实现是什么?例如,所有 20 个实例是否仍会为该端点提供服务?我可以为每个实例获取一个特定的端点吗?

我们有一个独特的回调需求,可以通过利用公共端点上的正常负载平衡行为很好地满足该需求,但让每个实例都公开一个内部端点。根据已发布的端点限制数字,这是不可能的。那么,在定义内部端点时,是“每个实例 1 个”还是什么?是否所有角色实例都服务于端点?当他们说内部端点没有负载平衡时,Microsoft 是什么意思?所有流量是否只流向一个实例?这没有意义。

【问题讨论】:

    标签: azure azure-web-roles


    【解决方案1】:

    首先让我们澄清一下数字和限制。 EndPoints 的限制是针对角色,而不是针对实例。如果您不确定,或者仍然对角色和实例术语感到困惑,您可以查看my blog post on that。因此,限制是每个角色。

    现在端点之间的区别 - 我有一篇描述它们的博客文章 here。但在快速回合中,Internal EndPoint 只会在部署中内部打开通信。这就是为什么它是内部的。没有外部流量(来自 Internet)将能够到达内部端点。在这种情况下,它不是负载平衡的,因为没有流量通过/通过负载平衡器!内部端点的流量只在角色实例之间传输(最终通过一些内部路由硬件),但从不存在于部署边界。话虽如此,但必须已经清楚不能将 Internet 流量发送到内部端点。

    附注 - InputEndpoint 但是可以从 Internet 和部署内部发现。但它 LoadBalanced,因为到 InputEndpoint 的流量来自 Internet 通过/通过 LoadBalancer。

    回到数字。假设您有 1 个具有 1 个输入端点和 1 个内部端点的 WebRole。这使您的部署总共有 2 个端点。即使您启动 50 个实例,您仍然只有 2 个 EndPoints 计入 EndPoints 总限制。

    您能否获得特定实例的特定端点 - 当然可以!通过RoleEnvironemnt 类。它有Roles enumeration。每个角色都有Instances,每个实例都有InstanceEndpoints

    希望这会有所帮助!

    【讨论】:

    • 实例端点!赞成。谢谢你。此外,您已经比 100 篇博客更清楚地阐明了端点与实例限制的关系。我想知道 5 的限制是如何合理的,因为我可以有 20 个(或更多)服务器担任一个角色。
    【解决方案2】:

    端点在角色级别定义并为每个实例实例化。

    输入端点有一个公共 IP 地址,可以从互联网访问。该输入端点的流量在托管该端点的所有角色实例之间进行负载平衡(使用循环算法)。

    内部端点没有公共 IP 地址,只能从云服务或 virtual network 内部访问,包括该云服务。 Windows Azure 不会对内部端点的流量进行负载平衡 - 每个角色实例端点都必须单独寻址。 Ryan Dunn 有一个很好的 post 展示了一个与托管 WCF 服务的内部端点实现负载平衡交互的简单示例。

    Spring Wave 版本引入了 instance input endpoint 的预览版,这是一个公共 IP 端点,端口转发到特定角色实例。这显然不是负载平衡的,而是提供了一种直接连接到特定实例的方法。

    【讨论】:

      【解决方案3】:

      只是想让事情更简洁和具体:

      // get a list of all instances of role "MyRole"
      var instances = RoleEnvironment.Roles["MyRole"].Instances;
      
      // pick an instance at random
      var instance = instances[new Random().Next(instances.Count())];
      
      // for that instance, get the IP address and port for the endpoint "MyEndpoint"
      var endpoint = instance.InstanceEndpoints["MyEndpoint"].IPEndpoint;
      

      将内部端点视为查找其他 VM 的发现机制。

      【讨论】:

      • 谢谢。这是一个很好的例子。 Web 角色实例能否知道它自己的端点,或者以某种方式传达足够的信息,以便工作角色可以在该特定实例上调用回调?这就是我们所追求的。理想情况下,我们希望 Web 角色能够在消息负载中放入一些内容,以便辅助角色可以直接回调该 Web 角色实例,该实例将具有休眠线程。
      • RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"] - 这是当前角色实例的端点(即自己的端点)。对于其他实例的端点,通过角色,然后是每个实例 - 参考。我的答案)。但是,不建议使用特定实例。
      • @astaykov 在这种情况下,我必须使用特定的实例,因为该实例是保持与客户端的连接的实例,并且需要通知它。如果该实例稍后死掉,那也没关系,因为唯一命中该实例的进程是该实例明确指示这样做的进程。
      • 您也可以使用RoleEnvironment.CurrentRoleInstance.Id 来识别实例。然后你可以像这样寻找它:RoleEnvironment.Roles["MyRole"].Instances.Where(i => i.Id == targetId).Single().
      • @smarx 感谢您的提示。这将非常方便。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      相关资源
      最近更新 更多