首页 > 解决方案 > 使基于存储函数的确认/回调系统在 django + nginx 中与多个进程一起工作

问题描述

我们的回调系统的工作原理是,在您需要更多用户输入的请求期间,您将运行以下命令:

def view(req):
    # do checks, maybe get a variable.
    bar = req.bar()
    def doit():
       foo = req.user
       do_the_things(foo, bar)
    req.confirm(doit, "Are you sure you want to do it")

由此,服务器将函数对象存储在字典中,并将 UID 作为键发送给客户端,其中将显示确认对话框。当按下 OK 时,另一个请求被发送到另一个视图,该视图查找存储的函数对象并运行它。

这适用于单个进程部署。但是对于 nginx,如果存在大于 1 的进程池,则另一个进程会收到确认请求,因此没有存储功能,无法运行。

我们已经研究了强制 nginx 对某些请求使用某个进程的方法,但还没有找到解决方案。

我们还研究了多处理库和 celery,但是似乎没有办法将预定义的函数发送到另一个进程。

当继续请求可能来自单独的进程时,任何人都可以提出一种允许我们存储函数以供稍后运行的方法吗?

标签: djangonginxprocesscallbackasynccallback

解决方案


似乎没有充分的理由在这里使用定义为内联函数的回调。

网络是一个无状态的环境。您永远无法确定让同一台服务器连续处理两个请求,并且永远不应该编写代码来将数据存储在内存中。

相反,您需要将数据放入某种数据存储中。在这种情况下,会话是理想的场所;您可以将 ID 存储在那里,然后将用户重定向到从会话中弹出该键并在相关 ID 上运行进程的视图。同样,根本不需要内联函数。


推荐阅读