在haproxy中执行lua脚本会出现"yield not allowed"错误
2017-10-15 21:34:24
收藏:0
阅读:88
评论:1
我想把来自客户端的SOAP请求负载均衡到我的服务的不同实例之间。我不能改变客户端并希望通过查看请求的负载并提取某个ID来使请求粘附到特定实例上,以确保具有相同ID的所有请求最终在同一实例上结束。
我编写了一个Lua脚本来查看负载和额外的信息,但由于某种原因,每5-6个请求有50-60毫秒的延迟来建立连接(在之间的请求中具有0毫秒的延迟),并且我看到以下日志条目
Oct 15 23:27:48 rp-proxy-p1 haproxy[30995]: Lua sample-fetch 'parseElement': yield not allowed.
Oct 15 23:27:48 rp-proxy-p1 haproxy[30995]: Lua sample-fetch 'parseElement': yield not allowed.
我如何防止这种延迟并避免出现错误,这是什么意思?
我的haproxy.cfg文件
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
lua-load /etc/haproxy/routing.lua
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 1000
timeout client 500000
timeout server 500000
frontend my_frontend
bind *:7001
default_backend my_backend
backend my_backend
option tcp-check
balance source
stick-table type string size 30000k expire 30m
stick on "lua.parseElement"
server server1 server1.domain.com:8080 check port 8080 weight 1
server server2 server2.domain.com:8080 check port 8080 weight 1
routing.lua
function parseElement(txn, salt)
local payload = txn.req:dup()
local trx_id = payload.match(payload, "<transaction_id>(.-)</transaction_id>")
core.Info("value: "..trx_id)
return trx_id
end
core.register_fetches("parseElement", parseElement)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

实际上,我刚刚发现了我配置文件中的问题。
后端应该运行在 http 模式下,因此我在
backend my_backend中添加了mode http.Lua 脚本尝试访问请求体 (
txn.req),但是当脚本被执行时,如果请求体还没有到达,则无法访问。你可以通过在backend my_backend中添加option http-buffer-request来强制 HAProxy 等待请求体到达后再执行脚本。backend my_backend mode http option http-buffer-request option tcp-check balance source stick-table type string size 30000k expire 30m stick on "lua.parseElement" server server1 server1.domain.com:8080 check port 8080 weight 1 server server2 server2.domain.com:8080 check port 8080 weight 1