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

时间:2017-03-23 04:26:10

标签: python flask multiprocessing uwsgi

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我认为你可以选择两条路线。

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

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

  3. 第二种选择的优点:

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