【问题标题】:Python + uwsgi - multiprocessing and shared app statePython + uwsgi - 多处理和共享应用程序状态
【发布时间】:2017-03-23 04:26:09
【问题描述】:

我们有一个烧瓶应用程序在 uwsgi 后面运行,有 4 个进程。它是一个 API,用于提供来自我们两个 ElasticSearch 集群之一的数据。

在应用引导时,每个进程从外部数据库中提取配置以检查哪个 ES 集群处于活动状态并连接到它。

Evey 不时发出 POST 请求(来自 aws SNS 服务),通知所有客户端切换 ES 集群。这会触发与 bootstrap 相同的功能 - 从 DB 拉取配置重新连接到活动的 ES 集群。

它作为单个进程运行良好,但是当我们有多个进程运行时,只有其中一个会得到更新(接收 POST 请求的那个)......其他进程仍然连接到非活动集群。

在每个请求上拉取配置以确保我们使用的 ES 集群处于活动状态会很慢。我正在考虑在本地安装 redis 并将 active_es_cluster 存储在那里......还有其他想法吗?

【问题讨论】:

    标签: python flask multiprocessing uwsgi


    【解决方案1】:

    我认为你可以走两条路。

    1. 有一个端点“/set_es_cluster”会被您的 SNS POST 请求命中。然后,此端点设置密钥“active_es_cluster”,其他进程在每次 ES 请求时都会读取该密钥。这样做的缺点是,对于每个 ES 请求,您都需要先进行 redis 查找。

    2. 有一个单独的进程专门获取 POST 请求(我假设集群不会经常更改)。此过程的目的是接收 post 请求并让 uWSGI 优雅地重新启动您的其他烧瓶进程。

    第二种方案的优点:

    • 不必在每次请求时都访问 redis
    • 让 uWSGI 为您处理重启(它做得很好)
    • 您已经在运行时设置了配置拉取,因此它应该“只适用于”您现有的应用程序

    【讨论】:

    • 我已经开始寻找 python uwsgi 模块,他们的缓存框架可以完成这项工作。 uwsgi-docs.readthedocs.io/en/latest/PythonModule.html。感谢您为我指明正确的方向。
    • 当然。如果将新主机添加到集群中,一些 ES 客户端也能够识别它们。不确定您的设置是什么样的,但这可能值得一看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多