当前位置: 首页 > 面试题库 >

在Go中创建空闲超时?

颛孙天宇
2023-03-14
问题内容

我将CloudFlare用于我的一个高流量网站,它位于堆栈的前面。

关键是CloudFlare除了创建新的连接之外,还保留空闲连接,这不是我可以更改的设置。

当我让Varnish或Nginx坐在前面监听端口80时,它们具有开箱即用的配置来挂断空闲连接。

很好,直到我必须将用Go编写的代理添加到堆栈的最前面。它使用net/http标准库。

我不是Go向导,而是根据人们告诉我的内容,只有读写超时设置,而不挂断空闲连接。

现在,除非设置了设置的读取和写入超时,否则我的服务器将填满连接并终止,但是问题是我的后端有时会花费很长时间,这会导致良好的请求在不应该的时候被切断。

使用Go http处理空闲连接的正确方法是什么?

编辑1:
更清楚地说,我httputil.NewSingleHostReverseProxy用来构造代理,该代理公开传输选项,但仅针对上游。我遇到的问题是下游的,需要在http.Server使用ReverseProxy作为处理程序的对象上进行设置。http.Server不暴露运输。

编辑2: 与读超时相比,我更喜欢空闲超时,因为后者将适用于活动上载器。

谢谢


问题答案:

在Go
http服务器中挂断空闲连接的正确方法是设置读取超时。

无需设置写入超时即可挂断空闲客户端。如果此设置会切断响应,请不要设置或调整它。

如果上传时间较长,请使用连接状态回调来实现单独的空闲和读取超时:

server.ConnState = func(c net.Conn, cs http.ConnState) {
    switch cs {
    case http.StateIdle, http.StateNew:
        c.SetReadDeadline(time.Now() + idleTimeout)
    case http.StateActive:
        c.SetReadDeadline(time.Now() + activeTimeout)
    }
}


 类似资料:
  • 问题内容: 如何在Go HTTP客户端中使空闲超时? 空闲超时意味着从HTTP客户端内部调用Conn接口的Read / Write方法时发生超时。当客户端下载文件并且由于读取超时而导致下载失败时,此功能很有用。 问题答案: 您需要创建自己的,并返回,以设置适当的读写期限。 该会是这个样子:

  • 检测空闲连接和超时是为了及时释放资源。常见的方法发送消息用于测试一个不活跃的连接来,通常称为“心跳”,到远端来确定它是否还活着。(一个更激进的方法是简单地断开那些指定的时间间隔的不活跃的连接)。 处理空闲连接是一项常见的任务,Netty 提供了几个 ChannelHandler 实现此目的。表8.4概述。 Table 8.4 ChannelHandlers for idle connections

  • 我正在使用带有连接池的reactor-netty http客户端(0.7.X系列),我想配置池连接的空闲超时,但不知道在哪里。 更准确地说,我需要配置reactor-netty http客户端连接池,使其能够自动关闭在可配置超时内未看到任何活动的连接。这些连接是开放的,但在一段(可配置的)时间内没有传输字节。 如何配置reactory-netty超文本传输协议客户端抢先关闭空闲连接?

  • 嗨,我现在正在制作一个聊天机器人,它将集成到我的facebook页面。我想问一下,在用户暂停或空闲后,如何让我的聊天机器人说“我们的对话空闲”之类的话。我目前在免费计划中

  • 问题内容: 我最近一直在使用来处理带注释的Websocket,并与之聊天。 但是我遇到了一个问题,5分钟后(我相信这是默认计时器),该会话关闭(这不是由于错误)。我找到的唯一解决方案是在关闭事件发生时通知我的套接字,然后在新的套接字中重新打开连接。 但是我已经阅读了stackOverflow,通过在WebsocketPolicy 中进行设置,我可以避免出现此问题: 我尝试设置为例如,但是行为完全没

  • 在 Apache HttpClient 4.3 版本上配置连接空闲超时的最短方法是什么? 我看了文档,什么也找不到。我的目标是将开放连接减少到最小的服务器峰值。 例如,在Jetty客户端8. x中,您可以设置httpClient.setIdleTimeout:http://download.eclipse.org/jetty/stable-8/apidocs/org/eclipse/jetty/c