【发布时间】: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