解决Docker容器中Django + Celery的API超时问题

时间:2017-01-05 12:33:47

标签: python django docker containers celery

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

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

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

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

那时,所有其他容器都回答得很好。

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

  • Django的
  • django的静止框架
  • 芹菜
  • Django的芹菜
  • 嵌入式Redis作为芹菜经纪人
  • 访问另一个容器中的PostgreSQL数据库

我无法弄清楚如何解决问题,因为服务或Docker日志中没有相关信息。

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

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

有关如何解决这个问题的想法吗?

1 个答案:

答案 0 :(得分:0)

您可以在正在运行的容器中进行shell并检查。芹菜过程是否还在运行等......

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容器来获取此信息。这样,我可以使用stock nginx容器来处理我的所有Web服务。

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