使用 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
- 您并不总是有足够的能力来响应传入的请求,但您不想丢失任何请求
在请求的速度高于您处理它们的速度的情况下,您基本上有以下三种选择:
- 您可以将消息放入 队列 并在容量可用时使用它们。您可以将 所有内容 放入队列中(简单),或者仅在事情太忙时才使用队列(更复杂)。
- 您可以 扩展来处理负载 ,通过使用 Auto Scaling 添加额外的 Amazon EC2 实例或使用 AWS Lambda 处理请求(Lambda 自动扩展)。
- 您可以删除您无法处理的请求。除非您实施了队列,否则如果请求超过您的处理能力,这将在某个时刻发生。
最好的解决方案是使用 AWS Lambda 函数 而不是需要 Amazon EC2 实例。 Lambda 可以直接绑定到 AWS API 网关 ,它可以前端处理 API 请求并提供安全性、节流和缓存。
最简单的方法是使用 Auto Scaling 来增加实例数以尝试处理您收到的请求量。当有可预测的使用模式时,这是最好的,例如白天高负载和夜间低负载。当尖峰出现在短暂的、不可预测的时期时,它的用处不大。
为了完全保证不丢失请求,您需要使用队列。您需要一个初始层来接收请求并将其推送到队列中,而不是直接将请求发送到您的应用程序。然后后端进程将处理该消息,并且 return 结果 以某种方式 作为响应传回。 (对通过队列传递的消息提供响应更加困难,因为请求和响应之间存在脱节。)
我们正在为我们的服务使用 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
- 您并不总是有足够的能力来响应传入的请求,但您不想丢失任何请求
在请求的速度高于您处理它们的速度的情况下,您基本上有以下三种选择:
- 您可以将消息放入 队列 并在容量可用时使用它们。您可以将 所有内容 放入队列中(简单),或者仅在事情太忙时才使用队列(更复杂)。
- 您可以 扩展来处理负载 ,通过使用 Auto Scaling 添加额外的 Amazon EC2 实例或使用 AWS Lambda 处理请求(Lambda 自动扩展)。
- 您可以删除您无法处理的请求。除非您实施了队列,否则如果请求超过您的处理能力,这将在某个时刻发生。
最好的解决方案是使用 AWS Lambda 函数 而不是需要 Amazon EC2 实例。 Lambda 可以直接绑定到 AWS API 网关 ,它可以前端处理 API 请求并提供安全性、节流和缓存。
最简单的方法是使用 Auto Scaling 来增加实例数以尝试处理您收到的请求量。当有可预测的使用模式时,这是最好的,例如白天高负载和夜间低负载。当尖峰出现在短暂的、不可预测的时期时,它的用处不大。
为了完全保证不丢失请求,您需要使用队列。您需要一个初始层来接收请求并将其推送到队列中,而不是直接将请求发送到您的应用程序。然后后端进程将处理该消息,并且 return 结果 以某种方式 作为响应传回。 (对通过队列传递的消息提供响应更加困难,因为请求和响应之间存在脱节。)