举一个简单的例子:
location /tcp { content_by_lua_block { local sock = ngx.socket.tcp()
local ok, err = sock:connect(server, 80) if not ok then ngx.say("failed to connect to ", server, ' ', err) return end local sent = sock:send('GET /\r\n\r\n')
local line, err, partial = sock:receive() if not line then ngx.say("failed to read a line: ", err) return end ngx.say("got:", line) sock:setkeepalive(0, 100) } }
上面的代码创建了一个 cosocket, 访问 baidu 的页面. 其中的 sock:connect, sock:send, sock:receive 等函数都是异步操作. 以 connect 作例子, 当发出 tcp 包等待返回三次握手回复的时候, 这个协程就被挂起 (lua_yield) 了. 如果有其他的请求进来, 同样处理 connect 的逻辑, 再次挂起. 然后第一个 connect 的 TCP 回复来了. nginx 的事件机制触发, 回调然后继续执行 (lua_resume) 这个协程. 从 lua land 来看, sock:connect() 函数同步返回. 继续执行 sock:send(), sock:receive()…
你写访问 mysql 的逻辑就可以和上面的代码一样. connect/send/receive.
/nickr
如题
当Nginx同一时间收到大量请求,比如这些请求都需要进行数据库查询。
如果Nginx是事件机制。
那么这里作为Nginx后端的Lua是怎么处理这些请求的呢?
采用多线程? 还是利用协程做事件循环?
如果是事件循环? 那么和mySQL的接口该如何做? 做一个处理SQL的工作线程?
谢谢
--
--
|