在haproxy路由请求之前使用lua进行http请求

我有一个Lua代理需要路由请求。每个请求的目标基于另一个带有初始请求的标题的响应进行确定。我的理解是HAProxy是一个事件驱动的软件,所以绝对禁止阻塞系统调用,并且我的代码正在进行HTTP请求,是阻塞的。

我读了关于在请求之后进行yield的文章,但我认为这不会有帮助,因为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 )

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

点赞
用户13086226
用户13086226

你应该考虑使用 HAProxy 的 SPOE,这个功能专门用来处理这些阻塞的情况。

2021-03-09 13:50:32
用户1995187
用户1995187

我使用 Lua 成功完成了它。我之前的错误在于使用了 require('requests'),这将会阻塞。理想情况下,对于 HA 永远不要使用 Lua 的外部库。我必须使用普通的 sockets 处理并发起一次 HTTP 请求,并且非常重要的是使用 HA 核心方法 core.tcp() 而不是 Lua sockets。

2021-03-12 11:15:48