Python + uwsgi - 多处理和共享应用程序状态

Python + uwsgi - multiprocessing and shared app state

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

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

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

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

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

我认为有两条路线可以走下去。

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

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

第二种方案的优点:

  • 不必在每次请求时都访问 redis
  • 让 uWSGI 为您处理重启(它做得很好)
  • 无论如何,您已经设置了在运行时提取的配置,因此它应该 "just work" 与您现有的应用程序