/ / Виправлення неполадок API тайм-аут від Django + Селера в контейнері Docker - python, django, docker, container, celer

Виправлення неполадок з таймером API від Django + Celery в контейнері Docker - python, django, докер, контейнери, селера

У мене є архітектура мікро-сервісів нехай 9 послуг, кожна з яких працює у власному контейнері.

Служби використовують суміш технологій, але в основному Django, Celery (з чергою Redis), спільна база даних PostgreSQL (у власному контейнері) і деякі більш конкретні послуги / бібліотеки.

Мікро-служби спілкуються один з одним за допомогою REST API.

Проблема в тому, що іноді випадковим чином деякі контейнери API більше не реагують і застрягають. Коли я видаю a curl запит на їх інтерфейс Я отримую тайм-аут.

У цей момент всі інші контейнери відповідають добре.

Існує два контейнера, що застрягли. Я помітив, що обидві блокування використання контейнерів:

  • Джанго
  • django-rest-framework
  • Селера
  • django-селера
  • Вбудований Redis як брокер селери
  • Доступ до БД PostgreSQL, що стоїть в іншому контейнері

Я не можу зрозуміти, як усунути проблему, оскільки в журналах Служб або Docker не відображається відповідна інформація.

Проблема в тому, що ці API "застрягли тільки у випадкові моменти. Щоб змусити його знову працювати, мені потрібно зупинити блокування контейнера і почати його знову.

Мені було цікаво, чи може це бути проблема python GIL, але я не знаю, як перевірити цю гіпотезу ...

Будь-яка ідея про те, як розв'язати цю проблему?

Відповіді:

0 для відповіді № 1

Ви можете оболонку в запущений контейнер і перевірити речі. Процес селери продовжується, і т.д.

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

Якщо ви використовуєте, наприклад, django, ви можете перейти до каталогу django і виконати manage.py shell і почати там тикати.

У мене аналогічна установка, де я запускаю кілька веб-служб, використовуючи django / celery / celerybeat / nginx / ...

Однак, як правило, я запускаю один процес на контейнер (виняток - django і gunicorn запускаються в одному контейнері). Потім я поділяю свої речі за допомогою --volumes-from.

Наприклад, gunicorn додаток записує у файл .sock, а контейнер має власний конфігурацію nginx; контейнер nginx робить a --volumes-from контейнер django для отримання цієї інформації. Таким чином, я можу використовувати контейнер nginx для всіх своїх веб-служб.

Інша зручна річ для налагодження - це вхідstdout і використовуйте драйвер журналу докера (splunk, logstash тощо) для виробництва, але маєте його вхід до контейнера під час налагодження. тест. Одним з найважливіших речей щодо докера є те, що ви можете взяти точний код, який не працює, і запустити його під мікроскопом, щоб налагодити його.