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