/ / Troubleshooting API timeout от Django + Целина в Docker контейнер - python, django, docker,

Отстраняване на неизправности при изтичане на API от Django + Целина в Докер контейнер - питън, джанго, докер, контейнери, целина

Имам архитектура на микро-услугите на споменатите 9 услуги, всяка от които работи в собствен контейнер.

Услугите използват комбинация от технологии, но основно Django, Celery (с Redis Queue), споделена база данни PostgreSQL (в свой собствен контейнер) и някои по-специфични услуги / библиотеки.

Микрослужбите говорят помежду си чрез REST API.

Проблемът е, че понякога случайно, някои контейнери API не реагират повече и се забиват. Когато издавам a curl заявка на техния интерфейс получавам таймаут.

В този момент всички други контейнери отговарят добре.

Има два наливни контейнера. Това, което забелязах, е, че и двете блокиране използване на контейнери:

  • 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 и др.) за производство, но трябва да влезете в контейнера при дебъгване. тест. Едно от най-големите неща за докера е, че можете да вземете точния код, който се проваля в производството, и да го изпълните под микроскопа, за да го отстраните.