大家好,我是新入坑小白,请大家多多关照。我有使用Lua的工作经验,但对nginx/openresty了解甚少(大概累计40-50小时学习)。

问题背景:我是游戏行业的,最近在研究如何利用openresty/nginx直接搭建服务器框架。选openresty是因为它,基础看起来可靠,有luajit支持,现成可用,在此不讨论。

期望实现的逻辑:接收请求后,生成闭包,丢到执行队列中,稍后由daemon协程顺序执行。期间要实现帧率控制,每次执行完队列后需要sleep,精度接近 0.0x 秒即可。(至于为什么做这些就不展开了)。

问题如题,init阶段无法启用协成,也无法sleep。看起来 ngx.thread.spawn 和 ngx.sleep 都需要有请求作为依附。

使用init_worker可以启动,但是: 1. master进程也需要服务器帧,进行集群控制等业务; 2. ngx.log竟然不再输出?

我能否使用lua的coroutine.create和其他的sleep?度娘说别的sleep是不行的,不知道coroutine.create能不能用。

求大神指教,有变通之法也行,谢谢!

    21 days later

    可以考虑配合redis的pub/sub,init_worker的时候创建一个心跳用的计时器,当然因为多个worker存在,可以通过共享内存表限制下,确保只有一个worker会启动心跳计时器,每次心跳就publish一条特定topic的数据。

    然后每个请求进来后,没必要特意做队列,直接订阅心跳topic,并开始等待redis的数据。下一个心跳publish数据后,接收到这个数据的请求处理会继续执行,执行完成关闭redis和发回结果。这算是比较符合nginx的用法。

    当然,如果你的客户端用的是长连接,那么每个请求需要ngx.thread.spawn一个新的thread去订阅和等待心跳数据。请求的主协程用于从客户端获取请求数据,等待下一个心跳再执行后,发回结果。我用OR做MQTT服务器就这么做的,当然还有很多细节。思路你可以参考下。

      Write a Reply...