http 请求的 kubernetes/elb 超时是多少?

Posted

技术标签:

【中文标题】http 请求的 kubernetes/elb 超时是多少?【英文标题】:what are the kubernetes/elb time outs for http requests? 【发布时间】:2020-04-28 09:04:05 【问题描述】:

我有一个java API(接受HTTPS请求_打包成一个docker镜像,然后使用k8s集群部署在EC2s之上。主EC2前面有一个ELB。

我可以向 ELB 发出 curl POST 请求以访问该 java API。

有时我的 curl 请求会一直等待响应,即使当我看到 kube 日志处理成功时也是如此。

对于 40 分钟左右的较大请求会发生这种情况,25 分钟的请求会得到响应。

您认为超时可能在哪里?我应该查看任何特定的配置参数吗?

client (curl) --> ELB --> k8s --> pod 运行 java api 镜像

我认为这与 ELB 相关(我没有设置 IdleTimeout),但文档说默认值为 60 秒,尽管我可以获得 20 分钟请求的响应 “连接设置”: “空闲超时”

【问题讨论】:

“更大的请求大约 40 分钟”你的意思是什么? 即上传大文件,api 需要 40 分钟通过 ETL 过程“摄取”它,然后返回响应 我想知道为什么你的主服务器前面有一个 LB(你的意思是 api-server?),以及你如何访问你的 API 来访问那个 LB。 【参考方案1】:
 aws elb modify-load-balancer-attributes --load-balancer-name my-loadbalancer --load-balancer-attributes "\"ConnectionSettings\":\"IdleTimeout\":300"

在 cLI 中使用它来将超时更改为 5 分钟

【讨论】:

【参考方案2】:

正如 Pampy 在他的回答中提到的,ELB 超时只计算空闲时间。这可以在 1 到 4000 秒之间,默认设置为 60 秒。您可以使用 CLI 或控制台更改超时。

以下是使用 CLI 将其更改为 5 分钟的示例:

aws elb modify-load-balancer-attributes --load-balancer-name my-loadbalancer --load-balancer-attributes "\"ConnectionSettings\":\"IdleTimeout\":300"

来源:docs

由于您上传大文件需要 20-40 分钟,我仍然会推荐其他有关使用 RabbitM 或 Kafka 等消息代理来异步处理上传和处理的建议。

【讨论】:

【参考方案3】:

25 分钟对于 HTTP 请求来说是相当长的。我非常同意 P Ekambaram 的观点。

我认为最好使端点异步并在文件上传后立即回复(应该更快),同时使用中间件消息传递(RabbitMQ、Kafka 或 NATS)或 Websocket 来推送文件成功导入和处理后的事件。

【讨论】:

【参考方案4】:

为什么不上传文件并将事件推送到消息代理,如rabbitMQ。使用 kubernetes Job/CronJob 对象异步对文件进行 ETL 并通知客户端。

这样,您不必长时间阻止传入的请求。发布事件后上传后向客户端发送一条消息,表明正在处理请求。

【讨论】:

我还是想知道超时在哪里【参考方案5】:

ELB 超时仅适用于 "idle" time。 这意味着只要您的上传仍在运行,它就不会空闲。 当文件到达您的服务器时,您需要测量服务器响应的时间。

当得到正确的,服务器将处理请求并在之后向客户端返回响应。 默认超时时间为 60 秒,您的服务器有这 60 秒的时间来处理上传的文件并返回答案。

也许您的服务器需要不到 60 秒的时间来处理 25 分钟的上传,但处理 40 分钟的上传需要更多时间?

【讨论】:

60 秒从何而来?我没有在 ELB 上使用默认的 IdleTimeout 60秒是ELB默认的空闲超时时间。你不能“不使用”它。您可以将其修改为 1 秒到 60 分钟之间,但没有办法告诉 ELB 根本不要终止连接。

以上是关于http 请求的 kubernetes/elb 超时是多少?的主要内容,如果未能解决你的问题,请参考以下文章

html超链接斜杠的问题?

PHP超全局变量

HTTP协议

HTTPTSlHTTPS的工作原理详解

HTTP/1.1协议初识

Http状态信息