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

Python+;uwsgi-多处理和共享应用程序状态,python,flask,multiprocessing,uwsgi,Python,Flask,Multiprocessing,Uwsgi,我们有一个flask应用程序在uwsgi后面运行,有4个进程。它是一个API,提供来自我们两个ElasticSearch集群之一的数据 在应用程序引导中,每个进程从外部数据库提取配置,以检查哪个ES群集处于活动状态并连接到它 每个POST请求(来自aws SNS服务),通知所有客户端切换ES群集。这将触发与引导上相同的功能—从DB重新连接到活动ES群集的pull config 它可以作为单个进程运行,但是当我们有多个进程运行时,只有其中一个进程会得到更新(接收POST请求的那个进程)。。。其他进

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

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

每个POST请求(来自aws SNS服务),通知所有客户端切换ES群集。这将触发与引导上相同的功能—从DB重新连接到活动ES群集的pull config

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


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

我想你可以走两条路

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

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

  • 第二种选择的优点是:

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

    我已经开始寻找python uwsgi模块,他们的缓存框架完成了这项工作。谢谢你给我指明了正确的方向。当然。此外,如果将新主机添加到集群中,某些ES客户端还能够识别它们。不确定您的设置是什么样的,但这可能是值得一看的。