首页 > 解决方案 > 阻止来自 pod 的最大 http 请求数

问题描述

我有一个 Go 应用程序,它部署到 Kubernetes 上的两个 8 核心 Pod 实例。从中,我收到一个 id 列表,然后我通过将每个 id 发送到 POST 端点来从另一个服务检索一些数据。我正在使用有界并发模式来为该外部服务提供最大数量的同时 goroutines(以及因此的请求)。

我将并发限制设置为:

sem := make(chan struct{}, MAX_GO_ROUTINES)

有了这个设置,我开始通过增加 MAX_GO_ROUTINES 数字来玩弄它。我通常会收到大约 20000 个 ID 来检查。所以我通过在 100 到 20000 之间的任何地方设置 MAX_GO_ROUTINES 来玩弄。

我注意到的一件事是,随着我越来越高,一些请求开始失败并显示以下消息:从此外部服务重置连接。

所以我的问题是:

  1. 在这种情况下,拦截器是什么?
  2. 具有 8 个内核和 4GB 内存的服务器可以发送的并发 HTTP POST 请求的限制是多少?是内存限制吗?或文件描述符限制?
  3. 我收到的错误是来自我的服务器还是来自外部服务器?

标签: goconcurrency

解决方案


在这种情况下,拦截器是什么?

正如评论所述:HTTP“连接重置”通常意味着

连接被对等方意外关闭。在发回响应之前,服务器似乎在毫无戒心的 HTTP 客户端上断开了连接。这很可能是由于高负载。

大多数网络服务器(如 nginx)都有一个队列,它们在等待服务时在其中暂存连接。当队列超过某个限制时,可能会断开连接并“重置”。因此,这很可能是您的上游服务已饱和(即您的应用发送的请求多于它所能提供的服务并使其队列超载)

具有 8 个内核和 4GB 内存的服务器可以发送的并发 HTTP POST 请求的限制是多少?是内存限制吗?或文件描述符限制?

全部 :) 在某些时候,您的特定工作负载将超载逻辑限制(如文件描述符)或“物理”限制(如内存)。不幸的是,真正了解哪些资源将被耗尽(以及您遇到哪些限制)的唯一方法是运行测试、分析和基准测试您的工作负载:(

我收到的错误是来自我的服务器还是来自外部服务器?

HTTP 连接重置很可能是外部的,它表示连接对等方(上游服务)重置了连接。


推荐阅读