hi,all
最近在做一个流量调度模块, 作用是按照 uri 与一些负载信息将请求发送到不同后端, 全局配置存储在中心数据库, 遇到几个问题, 麻烦请教下
第一, 性能问题
测试环境下, 一个 nginx worker, 原生的 upstream 可以到7000 qps, 直接使用 set_current_peer 也可以到接近7000 qps, 但是增加了一些逻辑操作之后, 性能掉的很厉害, 完整的逻辑下来, 已经到了不到5000 qps, 代码已经很精简, 一些必要的操作都会导致 qps 下降, 比如重试
if ngx.ctx.tries == nil then
balancer.set_more_tries(1)
ngx.ctx.tries = 1
end
在 ab 测试中都会有接近100的性能下降, 更别说增加 header 头信息这样的字符串操作了, 问下是否有提高的办法
第二, share dict 的 incr 是否可以增加不存在设成1的参数控制
流量转发中, 有根据后端负载/2xx 比例/当前 running 数目进行转发的逻辑, 有一些数据记录在 shared dict 中, 由于 shared dict 对 incr 不存在返回错误, 而多个操作不能原子进行, 现在在初始化时全部设置成0, 增加了一些额外的麻烦, 有没有考虑 incr 时不存在设置成1, 像 redis 那样
第三, timeout 的设置
转发时客户端可能会带 timeout 参数过来, 但是没有找到在 lua 中设置 proxy_conn_timeout, write/read timeout 的 api, 如果有, 可否给下文档地址, 或者说明有即可
第四, 是否有关闭特定worker 请求处理的api
想实现部分 worker 处理请求, 部分 worker 同步策略的逻辑, 现在是通过启动时各个 worker 竞争全局锁, 拿到锁的进入死循环+sleep同步, 问下是否有更好的办法
另外, 赞一下 set_current_peer, 把请求交给 nginx 处理, 比 ngx 默认的 http 性能好很多, 也比基于 ngx.socket 的 http 库性能好很多
3ks