【问题标题】:Python Pyramid Shutdown EventPython Pyramid 关闭事件
【发布时间】:2018-08-14 23:32:30
【问题描述】:

我是 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

【问题讨论】:

标签: python docker pyramid netflix-eureka waitress


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2015-08-24
      • 2020-08-11
      • 2016-06-13
      • 1970-01-01
      相关资源
      最近更新 更多