1

我正在研究一个基本上是重定向的服务设计问题。

我得到的请求链接将包含一些参数(abc.com/param1=v1¶m2=v2)。我需要在这个链接上做两个任务

  1. 我需要格式化链接并将用户重定向到另一个域并传递一些参数(xyz.com/p1=v2),具体取决于参数1的值,这一步应该尽可能快

  2. 经过一些处理后,我需要将链接详细信息保存到我的数据库中。

我打算用 nginx+lua(openresty)+(Redis 或 Mongodb?) 组合来做到这一点。

由于这两个任务不相关,我打算将其拆分,异步执行。

作为重定向中的第一个任务,ngx.redirect("/link") 似乎很适合这种情况。但是文档说重定向调用将终止当前请求的处理

我怎样才能使这两个任务独立并且重定向将尽可能快地发生并且不应该等待第二个任务完成。

4

1 回答 1

0

我可以让另一个线程完成存储吗?如何将这项工作交给另一个线程?

是的,你当然可以,首先你必须完全理解lua 模块指令的顺序,然后为了让你在一个 ceperate 线程中进行 Mongodb 进程,你必须使用ngx.location.capture($url)调用,其中 $ url 是您的位置块中的 url:

location redirect/handling {
   ... // 
   content_by_lua_file url/to/your/code/forRedirectHandling
   ngx.location.capture(mongo/save):

}

location mongo/save {
  content_by_lua_file url/to/mongodbHandlingdCode
}

ngx.location.capture() 将指向您的第二个位置块,并使您的代码在另一个线程(nginx worker)中。

请参阅 openresty 文档以了解要使用的指令(access_by_lua、log_by_lua ...)

希望这有帮助:)

于 2016-06-20T13:33:17.687 回答