【发布时间】: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