【问题标题】:Limit number of connections to instances with AWS ELB使用 AWS ELB 限制与实例的连接数
【发布时间】:2017-12-09 20:32:28
【问题描述】:

我们将 AWS 经典 ELB 用于我们的服务,我们的服务一次只能处理 x 个请求。如果请求的数量大于 x,那么我们不想将这些请求路由到实例,也不想丢失这些请求。我们想限制在 ELB 中注册的实例的连接数。是否有一些 ELB 设置来配置与实例的最大连接数?

我能找到的另一个解决方案是使用 ELB 连接耗尽,但基于 ELB 文档 [1] ,使用连接耗尽将在处理飞行中的请求后将实例标记为 OutofService。这是否意味着在处理进行中的请求后,实例将被终止并从 ELB 中注销?我们不想终止和注销实例,我们只想限制与实例的连接数。有什么解决办法吗?

[1] http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-conn-drain.html

【问题讨论】:

  • 您不想将多余的请求发送到实例,也不想丢失请求。你想对他们做什么?另外,您能否提供有关您的后端的更多信息——请求需要很长时间(例如 20 多秒)还是非常快速的请求?请求是来自网络浏览器还是来自后端系统(例如 API 调用)?
  • @John 的问题,“你想用它们做什么?” 至关重要。他们需要去某个地方,或者导致立即错误,或者他们需要在平衡器中排队,直到后端的可用插槽可用或在等待时间槽太久后超时到期。 ELB 无法做到这一点,但可以使用 HAProxy 来完成,HAProxy 可以部署在 ELB 后面以实现冗余。我在我的一些应用程序中执行此操作——暂停溢出请求,直到后端的时隙空闲。请说明您对溢出请求的预期操作。
  • @JohnRotenstein 请求将来自 API 调用。请求不需要很长时间(
  • 为什么不让他们将消息放到 SQS 队列中呢?然后,您可以控制接收消息的速率,并让请求在发送时尽快进入,您需要某种方式将消息发送回请求者或像 Chris White 在他的回答中建议的那样扩展应用程序实例。
  • 按照原标题,有没有办法告诉ELB“我的3个实例中的每一个最多只能处理150个并发;如果你得到超过450个并发,给我450和放下其余的”?

标签: amazon-web-services amazon-elb


【解决方案1】:

ELB 更倾向于在为其注册的实例之间平均分配流量。如果你有更多的流量,你会抛出更多的实例来处理它。这通常是load balancer is matched with an auto scaling group 的原因。 Auto Scaling Group 将查看设置的约束,并在此基础上启动更多实例或将它们拉下来(即您的流量开始变慢)。

连接耗尽更多是为了从不良实例中提取流量,以免丢失。坏实例意味着它们没有通过健康检查,因为实例上的某些东西被破坏了。 ELB 本身不会终止实例,这是 Auto Scaling 组要做的另一部分(基本上终止坏实例并启动一个新实例来替换它)。 ELB 所做的只是停止向它发送流量。

【讨论】:

    【解决方案2】:

    看来你的情况是:

    • 用户正在向您的负载均衡器发送 API 请求
    • 您有多个与负载均衡器关联的实例来处理这些请求
    • 您似乎没有使用 Auto Scaling
    • 您并不总是有足够的能力来响应传入的请求,但您不想丢失任何请求

    在请求的速度高于您可以处理的速度的情况下,您基本上有三种选择:

    1. 您可以将消息放入 队列 并在容量可用时使用它们。您可以将所有内容放入队列中(简单),或者仅在事情太忙时使用队列(更复杂)。
    2. 您可以扩展以处理负载,方法是使用 Auto Scaling 添加额外的 Amazon EC2 实例或使用 AWS Lambda 处理请求(Lambda 自动扩展)。
    3. 您可以放弃您无法处理的请求。除非您实施了队列,否则如果请求超出您的处理能力,这将在某个时候发生。

    最好的解决方案是使用 AWS Lambda 函数,而不是需要 Amazon EC2 实例。 Lambda 可以直接绑定到 AWS API Gateway,后者可以前端 API 请求并提供安全、节流和缓存。

    最简单的方法是使用 Auto Scaling 来增加实例数量以尝试处理您到达的请求量。当存在可预测的使用模式时,这是最好的,例如白天的高负载和夜间的负载较少。当峰值出现在短期、不可预测的时期时,它的用处不大。

    为了完全保证不丢失请求,您需要使用队列。您需要一个初始层来接收请求并将其推送到队列中,而不是将请求直接发送到您的应用程序。然后,后端进程将处理该消息并返回一个结果,该结果以某种方式作为响应传回。 (对通过队列传递的消息提供响应更加困难,因为请求和响应之间存在断开连接。)

    【讨论】:

      【解决方案3】:

      AWS ELB 几乎没有限制获取请求。如果您的应用程序仅处理“N”连接,请使用 ELB 后面的多个服务器并将 ELB 健康检查 URL 设置为您的应用程序 URL。一旦您的应用程序无法响应请求,ELB 会自动将您的请求转发到 ELB 后面的另一台服务器。这样您就不会错过任何请求。

      【讨论】:

        猜你喜欢
        • 2017-02-27
        • 2021-08-27
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 2017-08-03
        • 2017-08-30
        • 1970-01-01
        相关资源
        最近更新 更多