Hello!
On Wed, Aug 15, 2012 at 2:10 AM, lhmwzy <lh...@gmail.com> wrote:
> 像drizzle这样的
> upstream cluster {
> # simple round-robin
> drizzle_server 127.0.0.1:3306 dbname=test
> password=some_pass user=monty protocol=mysql;
> drizzle_server 127.0.0.1:1234 dbname=test2
> password=pass user=bob protocol=drizzle;
> }
> ,似乎lua-resty-mysql只支持连接一个mysql服务器?
>
这只不过是最简单的 round robin 而已,一次还是只连接其中的一台 mysql 服务器。在 Lua 里面通过动态选择 mysql
服务器的 host/port 也完全可以通过 lua-resty-mysql 实现相同的功能。特别地,利用 lua-resty-mysql
目前也可以实现一种伪并发查询,例如
local db1 = mysql:new()
local db2 = mysql:new()
db1:connect(...)
db2:connect(...)
db1:send_query(...)
db2:send_query(...)
db1:read_result(...)
db2:read_result(...)
对于比较复杂的逻辑,利用即将合并到 ngx_lua master 分支的用户级 coroutine API 可以更优美地表达这种交替调用的逻辑。例如:
function f(args)
local db = mysql:new()
db:connect(args)
coroutine.yield()
db:send_query(...)
coroutine.yield()
return db:read_result(...)
end
local args1 = { host = "A", ... }
local args2 = { host = "B", ... }
local c1 = coroutine.create(function () return f(args1) end)
local c2 = coroutine.create(function () return f(args2) end)
-- our naive coroutine scheduler in Lua:
while true do
c1:resume()
c2:resume()
-- check for termination conditions and collect results...
end
上面的例子都是示意性的,略去了许多重要的细节,包括出错处理。
当然,更优美更彻底的并发请求(和输出)模型需要等待 ngx_lua 的轻量级线程 API(即 ngx.thread
API)了,呵呵。我正在开发中,希望这周末或者下周能在 ngx_lua 的 "thread" git 分支上得到一个可以运行的原型实现 :)
Best regards,
-agentzh