【问题标题】:Lua HTTP Request Timeout HangLua HTTP 请求超时挂起
【发布时间】:2014-06-27 10:12:16
【问题描述】:

我继承了一些通过 HTTP 请求/响应与服务器通信的 Lua 代码。这已经在该领域运行了几年,但我最近注意到来自系统的 HTTP 请求的超时有些挂起。每个单独的消息都可以定义自己的超时,但如果没有设置,则使用 30 秒的默认超时。几周前,我在一个系统上注意到,在它恢复并继续处理之前,有大约 15 分钟的超时挂起。但我目前正在查看一个在 30 秒超时后挂起超过 3 小时的系统。以下是请求的设置:

local socket = require "socket"
local http = require "socket.http"
local ltn12 = require "ltn12"
local ssl = require "ssl"
local try = socket.try
local protect = socket.protect
...
function serverapi.http_request(request, timeout)
    ... (local variable setup and logging)
    socket.TIMEOUT = timeout
    socket.http.TIMEOUT = timeout

    result, status_code, content = socket.http.request {
        url = request.url,
        method = request.method,
        headers = request.header,
        source = ltn12.source.string(request_body),
        sink = ltn12.sink.table(response_body),
    }

    ... (receive response and process)

我应该注意到,就它们所挂起的消息类型而言,挂起是不稳定的。因此,它与一条消息不一致。而且,正如我所说,这已经在该领域部署和运行了几年。

这里有人有什么想法吗...?即使这只是帮助调试正在发生的事情的一种方式。我什至不知道如何在发送请求并等待超时后进行任何类型的登录。

谢谢

【问题讨论】:

  • 挂起到底是什么样的?它挂在请求的哪个位置?初始连接?发送请求?等待响应开始?等待响应完成?
  • 在调用socket.http.request 之前有一条日志消息记录超时,并在打印收到的状态代码后立即有一条日志消息。所以挂起一定是在那个电话里。
  • 你能用wireshark捕获请求然后回放它们看看你是否得到相同的挂起?你能在进程中附加一个调试器吗?

标签: http lua timeout luasocket


【解决方案1】:

我的系统仍然面临超时问题,我正在尝试将超时时间降低到 30 秒,但现在没有运气,但在此过程中发现了一些有趣的文章和方法。希望对你有用。 我的方法可能看起来更偏向于 kong,这是因为我的搜索更针对 kong。

=======

方法 1

DNS Resolution can be taking time, switching to IP based can reduce the time taken

=======

方法2

We used HTTP and HTTPS timeout and it didn't work for us, refer to article no 2

=======

方法 3

我们目前正在使用 kong 框架,正在修改默认超时和 keepalive 参数,但似乎效果不佳。

=======

方法 4

changing underlying nginx configuration

【讨论】:

    【解决方案2】:

    我也遇到过类似的问题,而且套接字库很旧,最后一次更新是在 2007 年?我修复了 socket/http.lua 中的一个错误,但它仍然偶尔会挂起,所以不是这样。我尝试了 luacurl 并且它也挂起,所以它可能是编译代码级别的问题。我在 Windows 上。这些天 nodejs 有更多的动力,所以我不确定我有多想追求 Lua,除非支持得到改善。

    while string.find(line, "^%s") do
        value = value .. line
        line, err = sock:receive() -- was line = sock:receive()
        if err then return nil, err end
    end
    

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      相关资源
      最近更新 更多