1

我有一个需要路由请求的 Lua 代理。每个请求目标都是基于另一个 HTTP 请求的响应建立的,该请求带有来自初始请求的标头。我的理解是 HAProxy 是一个事件驱动的软件,所以阻塞系统调用是绝对禁止的,我的代码被阻塞是因为正在做一个 HTTP 请求。

我在请求后读到了关于屈服的信息,但我认为这无济于事,因为 HTTP 请求已经启动。执行请求的库是https://github.com/JakobGreen/lua-requests#simple-requests

local requests = require('requests')

core.register_fetches('http_backend', function(txn)
  local dest = txn.sf:req_fhdr('X-dest')
  local url = "http://127.0.0.1:8080/service";
 
  local response = requests.get(url.."/"+dest);

  local json = response.json()

  return json.field
end )

如何将我的代码转换为非阻塞的?

4

2 回答 2

1

我设法使用Lua做到了。我做错的事情是使用require('requests')它是阻塞。理想情况下,HA 永远不要使用 Lua 外部库。我必须处理普通套接字并执行 HTTP 请求,并且使用 HA 核心方法core.tcp()而不是 Lua 套接字非常重要。

于 2021-03-12T11:15:48.730 回答
1

您应该考虑使用专为这些阻塞场景创建的 HAProxy 的 SPOE 。

于 2021-03-09T13:50:32.933 回答