go - 阻止来自 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 来玩弄。
我注意到的一件事是,随着我越来越高,一些请求开始失败并显示以下消息:从此外部服务重置连接。
所以我的问题是:
- 在这种情况下,拦截器是什么?
- 具有 8 个内核和 4GB 内存的服务器可以发送的并发 HTTP POST 请求的限制是多少?是内存限制吗?或文件描述符限制?
- 我收到的错误是来自我的服务器还是来自外部服务器?
解决方案
在这种情况下,拦截器是什么?
正如评论所述:HTTP“连接重置”通常意味着:
连接被对等方意外关闭。在发回响应之前,服务器似乎在毫无戒心的 HTTP 客户端上断开了连接。这很可能是由于高负载。
大多数网络服务器(如 nginx)都有一个队列,它们在等待服务时在其中暂存连接。当队列超过某个限制时,可能会断开连接并“重置”。因此,这很可能是您的上游服务已饱和(即您的应用发送的请求多于它所能提供的服务并使其队列超载)
具有 8 个内核和 4GB 内存的服务器可以发送的并发 HTTP POST 请求的限制是多少?是内存限制吗?或文件描述符限制?
全部 :) 在某些时候,您的特定工作负载将超载逻辑限制(如文件描述符)或“物理”限制(如内存)。不幸的是,真正了解哪些资源将被耗尽(以及您遇到哪些限制)的唯一方法是运行测试、分析和基准测试您的工作负载:(
我收到的错误是来自我的服务器还是来自外部服务器?
HTTP 连接重置很可能是外部的,它表示连接对等方(上游服务)重置了连接。
推荐阅读
- javascript - Blogspot 模板:将小部件输出传递给 javascript
- angularjs - 从 angularjs 获取表单输入值
- javascript - 未捕获(承诺中):TypeError:无法读取 prod build angular7 中未定义的属性“dxswipestart”
- android - ChangeCursor 和 getItemViewType java.lang.ArrayIndexOutOfBoundsException
- r - bsModal 适用于 fluidPage 但不能没有它
- html - Nu Html 检查器错误“扩展为回车的数字字符引用。” 使用“”时
- graphql - 在 AWS 上使用 Cloudfoundry 部署的 Hasura GraphQL 引擎上的订阅错误
- java - F 有界多态 Java 中的返回类型
- sql - PostgreSQL 如何查询字符串数组
- asp.net-core-mvc - 从下拉列表中获取选定项目并将其传递给 onClick 事件