我们有一个在 uwsgi 后面运行的烧瓶应用程序,有 4 个进程。它是一个 API,提供来自我们两个 ElasticSearch 集群之一的数据。
在应用程序引导过程中,每个进程从外部数据库拉取配置,以检查哪个 ES 集群处于活动状态并连接到该集群。
Evey 时不时地发出 POST 请求(来自 aws SNS 服务(,通知所有客户端切换 ES 集群。这将触发与引导时相同的功能 - 从数据库重新连接到活动 ES 集群的拉取配置。
它作为单个进程运行良好,但是当我们有多个进程运行时,只有一个进程会更新(获取 POST 请求的那个(......其他进程仍连接到非活动群集的位置。
在每个请求上拉取配置以确保我们使用的 ES 集群处于活动状态会很慢。我想在本地安装 redis 并将active_es_cluster存储在那里......还有其他想法吗?
我认为你可以走两条路。
-
有一个终端节点"/set_es_cluster"被您的 SNS POST 请求击中。然后,此终结点设置密钥"active_es_cluster",其他进程在每个 ES 请求上读取该密钥。这样做的缺点是,在每个 ES 请求上,您需要先执行 redis 查找。
-
有一个单独的进程专门获取 POST 请求(我假设集群不经常更改(。此过程的目的是接收 post 请求,然后让 uWSGI 优雅地重新启动您的其他烧瓶进程。
第二种选择的优点:
- 不必在每个请求上都点击 redis
- 让uWSGI为您处理重新启动(它做得很好(
- 无论如何,您已经在运行时设置了配置拉取,因此它应该"仅适用于"您现有的应用程序