У мене є архітектура мікро-сервісів нехай 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 тощо) для виробництва, але маєте його вхід до контейнера під час налагодження. тест. Одним з найважливіших речей щодо докера є те, що ви можете взяти точний код, який не працює, і запустити його під мікроскопом, щоб налагодити його.