【问题标题】:Openresty: making two asynchronous tasksOpenresty:制作两个异步任务
【发布时间】:2023-03-08 05:21:02
【问题描述】:

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

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

  1. 我需要格式化链接并将用户重定向到另一个域 一些参数通过(xyz.com/p1=v2)取决于值,比如说, param1,这一步要尽量快

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

我打算用 nginx+lua(openresty)+(Redis 还是 Mongodb?) 组合来做这个。

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

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

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

【问题讨论】:

  • 也许将链接详细信息存储在某个变量/表中,重定向用户,然后冷静地处理数据并为所欲为。
  • 感谢您的回复!!。我可以让另一个线程完成存储吗?如何将这项工作交给另一个线程?
  • 我什至不知道,对不起:3

标签: nginx lua scalability url-redirection openresty


【解决方案1】:

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

是的,你当然可以,首先你必须完全理解Order of lua module directive,然后为了让你的Mongodb进程在一个ceperate线程中你必须用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...)

希望得到帮助:)

【讨论】:

  • 请问谁是该图形“lua 模块指令顺序”的作者或来源,我觉得它很有教育意义,我想从源代码中看到更多信息。 (一个简单的谷歌搜索没有给我任何结果)
  • 图源为openresty官方github仓库/ngx-lua-modulegithub.com/openresty/lua-nginx-module
  • 嗯,我已经在那个页面上过几十次了,不知道我是怎么错过的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
相关资源
最近更新 更多