繁体   English   中英

如何为我的员工组织健康检查(使用 python 代码的 Docker)?

[英]How can I organize healthcheck for my workers (Docker with python code)?

在我的项目中,我有一个 REST API(Flask-server)和 worker(在 Docker 容器中工作的 python 脚本 - 简单的无限循环,向服务器发出请求并开始工作)。 Flask-server 向工作人员发送任务。

但当然可能会出现问题,Docker 容器可能会崩溃。 在那一刻,我希望服务器知道它。 你能提供一个简单的方法来做到这一点吗?

使用Redis很容易做到这一点,它是一个非常轻量级、闪电般快速的内存数据结构服务器。 它可以为您的网络中的所有列表、哈希、集合、有序集合、整数、原子整数、字符串等提供bashPythonPHP 、 C/C++ 和其他所有客户端。

我会使用一个简单的 KEY 并在密钥上设置一个 EXPIRE,比如 10 秒。 然后,网络中的每个服务器和每个客户端只需至少每 10 秒设置一次由其主机名(或函数)命名的 KEY,这将重置其超时。 如果有人查询密钥并且它没有设置 10 秒,他们就知道客户端/服务器或主机/进程已经死亡。

文档在这里


另一种更简单的通信方式是通过文件系统。 每个工人必须每隔 N 秒“触摸” (创建)一个名为/tmp/WORKERXXX.alive的文件。 想要检查工作人员是否存活的进程然后每 N+1 秒检查一次文件是否存在并删除它们。 如果文件不存在,则重新启动工作程序。

触摸文件不必侵入您的工作人员的代码。 它可以简单地在启动时创建一个额外的线程,该线程运行一个无限循环,休眠 N 秒,然后触摸它的保持活动文件。

除了 Mark 的解决方案,在不更改 python 脚本(运行该无限循环)的情况下,您可以利用 docker-compose 并通过检查 python 进程是否正在运行来添加**粗略的**健康检查。

kill -0 $(pgrep python)

如果进程存在,上面返回 0,当进程不存在时,响应将为 1 - 从而触发docker-compose重新启动 python 脚本。

免责声明。 上述命令原样假设一个 python 进程在容器内运行。 如果您没有运行 python 脚本,或者您在脚本中使用线程,则需要修改上述命令以获得正确的PID

或者,您可以利用现有的异步任务队列框架,例如 Celery,并使用celery inspect作为 docker docker-compose中每个工作人员的健康检查 - 请参阅这篇文章了解更多详细信息: 运行 Celery 任务的 Docker 容器的 HEALTHCHECK?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM