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

ryoqjall  于 5个月前  发布在  Apache
关注(0)|答案(1)|浏览(89)

我正在编写一个与Zookeeper集成的应用程序,用于客户端服务发现。该应用程序是一个Python Flask应用程序,在K8s集群中部署了gunicorn和Docker。它使用kazoo Zookeeper客户端。由于层(gunicorn、Docker和K8s),我无法让kazoo watch功能在发生更改时自动更新服务端点。而且,我不想每次使用Zookeeper服务时都进行轮询,因为那样效率会很低。
我知道服务端点的变化一天只发生几次。所以,我正在考虑这种方法:每次我调用服务(使用请求GET),如果响应显示无法访问的URL(4xx错误),我将联系Zookeeper获取新的服务端点并重试。我的问题是,有人在实践中使用过这种方法吗?
在与Zookeeper集成时,我是否应该考虑其他客户端服务发现方法?

bnlyeluc

bnlyeluc1#

经过进一步的研究和实验,我发现替代方法是没有必要的。我得到了手表功能的工作。
watch函数最初对我不起作用,因为我在gunicorn中使用了preload选项,并在worker进程分叉之前创建了KazooClient对象。这意味着gunicorn worker进程试图共享KazooClient对象,这导致了watch函数不起作用。
修复方法是通过在Flask应用程序的“before_first_request”函数中执行此创建来延迟KazooClient对象的创建,这使得创建发生在gunicorn工作进程分叉之后。
(我知道“before_first_request”函数在Flask中被弃用,但现在它可以工作)

相关问题