我是Python和Pyramid的新手,所以如果我在这里做了错事,我深表歉意。在
我目前正在Docker容器内运行一个金字塔应用程序,入口点如下:
pipenv run pserve development.ini --reload
这为我的应用程序提供了正确的服务,然后我可以直接在容器内编辑代码。这一切都很好。然后,我试图将此服务注册到Netflix的Eureka服务注册中心的一个实例中,这样我就可以通过网关(如Netflix Zuul)代理到该服务。我使用了Eureka的restapi来实现这一点,这一切都很好。在
但是,当我要关闭金字塔服务时,我想向Eureka发送一个额外的HTTP请求以删除注册的服务-这是理想的,这样我就不必等待Eureka到期,而且永远不会有一个窗口让zul代理请求到被关闭的服务。在
问题是我无法可靠地找到一种在金字塔中运行关闭事件的方法。基本上,当我停止Docker容器时,服务会收到退出代码137(我相信这是kill-9的结果),并且什么也不会发生。我尝试过使用atexit和信号事件,如SIGKILL、SIGTERM、SIGINT等,但什么都没有发生。我也尝试过在没有--reload标志的情况下运行pserve,但仍然不起作用。在
在服务器和docker容器关闭之前,是否有任何方法让我可靠地发送这个删除事件?在
这是开发.ini我正在使用文件:
^{pr2}$
这是一个特定于web服务器的,金字塔不能为它提供抽象,因为“你的里程数可能会有所不同”。Web服务器工作人员本身无法知道他们何时被杀,因为这是外部强制的。在
我会采取一种方法,让一个外部进程监视web服务器,然后在它检测到web服务器不再运行时执行清理操作。不再运行的定义可能是“没有一个进程处于活动状态”。然后您只需要一个后台调度作业(cron)来检查这种情况。或者更好的方法是,将它放在另一个监视实例上,该实例位于另一个服务器上,并且可以在服务器本身发生故障的情况下执行操作。在
WSGI应用程序没有关闭协议/api(技术上讲也没有用于启动的协议/api,尽管人们使用/希望应用程序创建时间接近服务器开始处理请求的时间)。您可能可以找到一个提供一些钩子的WSGI服务器(例如gunicorn提供http://docs.gunicorn.org/en/stable/settings.html#worker-exit),但是更好的方法是让您的上游处理服务器通过健康检查消失。期望在出现问题时能够可靠地发送DELETE并不太可能是一个健壮的解决方案。在
相关问题 更多 >
编程相关推荐