【问题标题】:Troubleshooting API timeout from Django+Celery in Docker ContainerDocker 容器中 Django+Celery 的 API 超时故障排除
【发布时间】:2017-05-20 00:13:08
【问题描述】:

我有一个微服务架构,比如说 9 个服务,每个服务都在自己的容器中运行。

这些服务使用多种技术,但主要是 Django、Celery(带有 Redis 队列)、共享 PostgreSQL 数据库(在它自己的容器中),以及一些更具体的服务/库。

微服务通过 REST API 相互通信。

问题在于,有时以随机方式,某些容器 API 不再响应并卡住。 当我在他们的界面上发出curl 请求时,我得到了超时。

在那一刻,所有其他容器都回答得很好。

有两个卡住的容器。 我注意到的是两个 blocking 容器都使用:

  • 姜戈
  • django-rest-framework
  • 芹菜
  • django 芹菜
  • 作为 Celery 代理的嵌入式 Redis
  • 对位于另一个容器中的 PostgreSQL 数据库的访问

我不知道如何解决问题,因为在服务或 Docker 日志中看不到相关信息。

问题是这些 API 只在随机时刻卡住。为了让它再次工作,我需要停止阻塞容器,然后重新启动它。

我想知道这是否可能是 python GIL 问题,但我不知道如何检查这个假设...

知道如何解决这个问题吗?

【问题讨论】:

  • 使用 docker 时一般做法是每个容器一个守护进程
  • 我确实使用了supervisord,它反过来在同一个容器中的前台(nginx/gunicorn/celery/redis)运行了几个守护进程。
  • 我说这违背了使用 docker 的全部目的。为什么不直接在主机操作系统上运行所有这些东西?
  • 满足架构和模块化需求。但是我有很多其他服务可以使用多个守护程序运行良好。我怀疑问题出在其他地方。
  • 如你所愿。但这是糟糕的架构。使用 docker 只是因为营销部门认为通过提及一种流行的技术可以从客户那里收取更多的美元。

标签: python django docker containers celery


【解决方案1】:

您可以进入正在运行的容器并检查内容。 celery 进程是否还在运行等...

docker exec -ti my-container-name /bin/bash

如果您使用的是 django,例如,您可以转到您的 django 目录并执行 manage.py shell 并开始在那里寻找。

我有一个类似的设置,我使用 django/celery/celerybeat/nginx/... 运行多个 Web 服务。

但是,通常我每个容器运行一个进程(一种例外是 django 和 gunicorn 在同一个容器中运行)。然后我使用--volumes-from 分享内容。

例如,gunicorn 应用写入 .sock 文件,容器有自己的 nginx 配置; nginx 容器执行--volumes-from django 容器来获取此信息。这样一来,我就可以为我的所有 Web 服务使用库存 nginx 容器。

另一个方便调试的事情是记录到 stdout 并使用 docker 的日志驱动程序(splunk、logstash 等)进行生产,但在调试时让它记录到容器中。这样,当您对其进行测试时,您可以从 'docker logs' 中获取大量信息。 docker 的一大优点是您可以获取在生产中失败的确切代码并在显微镜下运行它来调试它。

【讨论】:

  • 感谢瑞恩的回答。 “但是,我通常每个容器运行一个进程”:不建议每个容器运行多个进程吗?这是否涉及事情混乱?我的容器用于运行这样的进程(灵感来自 Phusion Docker 镜像)my_init---runsvdir-+-runsv |-runsv---run---filebeat---9*[{filebeat}] -runsv---run---supervisord-+-gunicorn---gunicorn -nginx---4*[nginx]
  • 在实践中,我发现每个容器只保留一个进程更简单。它使事情变得更加模块化和可组合,更容易调试,更容易部署(就像你只需要部署你的 django 容器,如果你有代码更新,nginx 等只需要重启)等等。我见过其他团队尝试对于每个容器的多个进程——在尝试对现有应用程序进行 dockerize 时——它们通常会遇到问题。
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2019-07-01
  • 1970-01-01
  • 2010-10-27
  • 2014-12-14
相关资源
最近更新 更多