2

我对 Python 和 Pyramid 很陌生,如果我在这里做错事,我深表歉意。

我目前正在 Docker 容器内运行 Pyramid 应用程序,具有以下入口点:

pipenv run pserve development.ini --reload

这可以正确地为我的应用程序提供服务,然后我可以直接在容器内编辑代码。这一切都很好。然后我尝试将此服务注册到 Netflix 的 Eureka 服务注册表的一个实例,这样我就可以使用网关(例如 Netflix Zuul)代理到该服务。我使用 Eureka 的 REST API 来实现这一点,这一切都很好。

但是,当我关闭 Pyramid 服务时,我想向 Eureka 发送一个额外的 HTTP 请求以删除已注册的服务 - 这是理想的,所以我不必等待 Eureka 到期并且永远不会有一个窗口Zuul 可能会将请求代理到已关闭的服务。

问题是我无法可靠地找到在 Pyramid 中运行关闭事件的方法。基本上,当我停止 Docker 容器时,服务会收到退出代码 137(我相信这是 kill -9 的结果)并且什么也没有发生。我尝试过使用 atexit 以及信号事件,例如 SIGKILL、SIGTERM、SIGINT 等,但什么也没发生。我也试过在没有 --reload 标志的情况下运行 pserve ,但这仍然不起作用。

无论如何,我是否可以在服务器和 docker 容器关闭之前可靠地发送此 DELETE 事件?

这是我正在使用的 development.ini 文件:

[app:main]
use = egg:my-app
pyramid.reload_templates = true
pyramid.includes =
    pyramid_debugtoolbar
    pyramid_redis_sessions
    pyramid_tm

debugtoolbar.hosts = 0.0.0.0/0

sqlalchemy.url = mysql://root:root@mysql/keyblade

my-app.secret = secretkey

redis.sessions.secret = secretkey
redis.sessions.host = redis
redis.sessions.port = 6379

[server:main]
use = egg:waitress#main
listen = 0.0.0.0:8000

# Logging Configuration

[loggers]
keys = root, debug, sqlalchemy.engine.base.Engine

[logger_debug]
level = DEBUG
handlers =
qualname = debug

[handlers]
keys = console

[formatters] 
keys = generic

[logger_root]
level = INFO
handlers = console

[logger_sqlalchemy.engine.base.Engine]
level = INFO
handlers =
qualname = sqlalchemy.engine.base.Engine

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
4

2 回答 2

3

WSGI 应用程序没有关闭协议/api(尽管人们使用/希望应用程序的创建接近于服务器开始处理请求的时间,但从技术上讲也没有用于启动的协议/api)。您可能能够找到提供一些钩子的 WSGI 服务器(例如 gunicorn 提供http://docs.gunicorn.org/en/stable/settings.html#worker-exit),但更好的方法是让您的上游通过健康检查处理您的服务器消失。期望在出现问题时能够可靠地发送 DELETE 不太可能是一个可靠的解决方案。

于 2018-08-09T20:07:15.313 回答
0

但是,当我关闭 Pyramid 服务时,我想向 Eureka 发送一个额外的 HTTP 请求以删除已注册的服务 - 这是理想的,所以我不必等待 Eureka 到期并且永远不会有一个窗口Zuul 可能会将请求代理到已关闭的服务。

这是特定于 Web 服务器的,Pyramid 无法为其提供抽象,因为“您的里程可能会有所不同”。Web 服务器工作人员本身无法知道他们何时杀死,因为它是外部强制的。

我会采取一种方法,让您有一个外部进程来监视 Web 服务器,然后在它检测到 Web 服务器不再运行时执行清理操作。不再运行的定义可能是“没有一个进程活着”。然后,您只需有一个后台计划作业 (cron) 来检查这种情况。或者更好的是,将它放在另一个监控实例上,该实例位于不同的服务器上,并且可以在服务器本身出现故障的情况下采取行动。

于 2018-08-14T15:32:30.187 回答