使用 AWS ELB 限制与实例的连接数

Limit number of connections to instances with AWS ELB

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

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

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

ELB 更意味着在为其注册的实例之间平均分配流量。如果你有更多的流量,你就会抛出更多的实例来处理它。这就是为什么一般load balancer is matched with an auto scaling group。 Auto Scaling Group 将查看设置的约束,并基于此启动更多实例或将其拉低(即您的流量开始减慢)。

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

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

看来您的情况是:

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

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

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

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

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

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