当现有端点无法访问时,从 Zookeeper 获取新的服务端点

问题描述 投票:0回答:1

我正在编写一个与 Zookeeper 集成的应用程序,用于客户端服务发现。该应用程序是一个Python Flask应用程序,在K8s集群中使用gunicorn和Docker部署。它使用 kazoo Zookeeper 客户端。由于层(gunicorn、Docker 和 K8s)的原因,我无法让 kazoo watch 功能在发生更改时自动更新服务端点。而且,我不想每次使用该服务时都轮询 Zookeeper,因为那样效率很低。

我知道服务端点的变化一天只发生几次。因此,我正在考虑这种方法:每次调用服务(使用请求 GET)时,如果响应显示无法访问的 URL(4xx 错误),我将联系 Zookeeper 以获取新的服务端点,然后重试。我的问题是,有人在实践中使用过这种方法吗?

与 Zookeeper 集成时我应该考虑其他客户端服务发现方法吗?

docker gunicorn apache-zookeeper service-discovery kazoo
1个回答
0
投票

经过进一步的研究和实验,我发现替代方法是没有必要的。我的手表功能可以使用了。

watch 功能最初对我不起作用,因为我在gunicorn 中使用预加载选项,并在工作进程分叉之前创建 KazooClient 对象。这意味着gunicorn工作人员试图共享KazooClient对象,这导致手表功能无法工作。

修复方法是通过在 Flask 应用程序的“before_first_request”函数中执行此创建来延迟 KazooClient 对象的创建,这使得创建在 Gunicorn 工作进程分叉之后发生。

(我知道“before_first_request”函数在 Flask 中已被弃用,但目前它可以工作)

© www.soinside.com 2019 - 2024. All rights reserved.