1

我继承了一些通过 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)

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

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

谢谢

4

2 回答 2

0

我遇到过类似的问题,而且套接字库很旧,最后一次更新是在 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
于 2014-07-13T02:12:07.150 回答
0

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

=======

方法一

DNS解析可能需要时间,切换到基于IP可以减少所花费的时间

=======

方法二

我们使用了 HTTP 和 HTTPS 超时,但它对我们不起作用,请参阅第 2 条

=======

方法 3

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

=======

方法 4

更改底层 nginx 配置

于 2021-09-30T04:36:39.937 回答