如何使用Django在多个请求之间持久化数据

3
我有一个运行在 Kubernetes 集群内的 Django 应用程序,我想为其实现一个 prestop 钩子。这里的想法是,在每次调用 prestop 钩子时,Pod/容器将失败就绪探针检查,因此在集群关闭之前不会接收任何新请求。在这种情况下,我的应用程序中 readiness 探针和 prestop 钩子均为 api 端点:/readiness 和 /prestop。
另外,为了使 readiness 探针失败,在每次调用 /readiness 时,必须返回大于 400 的代码。
那么我的问题是,如何存储状态以指示在调用 prestop 钩子后应返回 400 的就绪探针状态?请注意,我只应为调用 prestop 钩子的 Pod 返回 400,其他 Pod/容器应继续正常运行。因此,我正在寻找一种方法来跟踪单个 Pod/容器的状态。
我做了一个非常愚蠢的测试,看看是否可以在请求之间保留计数器的状态:
class ReadinessProbeView(View):
    def __init__(self):
        self.count = 0

    def get(self, request):
        result = {}

        self.count = self.count + 1
        result["healthy"] = True
        result["count"] = self.count
        return JsonResponse(result, status=200)

无论我调用这个函数多少次,count = 1,因此状态没有在请求之间得到维护。

2
你正在使用什么WSGI服务器?最简单的选项是一个简单的全局变量,但这只适用于仅线程服务器(这也是推荐的)。 - coderanger
这是我的uWSGI配置:command: ["uwsgi", "--http", ":8000", "--wsgi-file", "wsgi.py", "--workers", "2", "--max-requests", "100", "--master", "--vacuum", "--enable-threads"] - Felipe
遵循@coderanger的建议。在同一模块中尝试使用全局变量。 - Pynchia
我遵循了@coderanger的建议,成功地保留了状态。至于uWSGI,我认为它是一个仅支持线程的服务器,就像你说的一样,对吗? - Felipe
为什么不设置环境变量呢? os.environ['RECEIVED_SIGTERM'] = '1' - Farhan Haider
2个回答

0

嗨,我认为我的情况比这个简单。我只需要存储一个布尔值,使应用程序通过或失败准备探针健康检查。 - Felipe
此外,这个布尔值是针对每个容器的。我不想要一个全局会话对象,因为它将在所有容器之间共享,导致它们都无法通过健康检查,并使应用程序崩溃。 - Felipe

0

我听从了@coderanger的建议并使用了全局变量。现在我的就绪探针按预期工作。

以下是我更新的示例:

count = 0
class ReadinessProbeView(View):
    def get(self, request):
        result = {}

        global count
        count = count + 1
        result["healthy"] = True
        result["count"] = count
        return JsonResponse(result, status=200)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接