Mam architekturę mikro usług, powiedzmy 9 usług, z których każda działa we własnym kontenerze.
Usługi korzystają z różnych technologii, ale głównie z Django, Selera (z kolejką Redis), wspólnej bazy danych PostgreSQL (w jej własnym kontenerze) i niektórych bardziej specyficznych usług / bibliotek.
Mikroserwisy rozmawiają ze sobą za pośrednictwem REST API.
Problem polega na tym, że czasami w sposób losowy niektóre API kontenera nie reaguje i nie daje się zablokować. Kiedy wydaję curl
Żądanie na ich interfejsie dostaję timeout.
W tej chwili wszystkie inne pojemniki odpowiadają dobrze.
Są dwa spiętrzone pojemniki. Zauważyłem, że oba bloking użycie pojemników:
- Django
- django-rest-framework
- Seler
- django-seler
- Wbudowany broker Redis jako seler
- Dostęp do bazy danych PostgreSQL, która znajduje się w innym kontenerze
Nie mogę znaleźć sposobu na rozwiązanie tego problemu, ponieważ w dziennikach usług lub w Dockerze nie są widoczne żadne istotne informacje.
Problem polega na tym, że te API są zablokowane tylko w przypadkowych momentach. Aby to działało ponownie, muszę zatrzymać blokujący kontener i uruchomić go ponownie.
Zastanawiałem się, czy to może być problem GIL Pythona, ale nie wiem, jak sprawdzić tę hipotezę ...
Masz pomysł, jak rozwiązać ten problem?
Odpowiedzi:
0 dla odpowiedzi № 1Możesz wejść do działającego kontenera i sprawdzić, co się dzieje. Czy proces selera nadal działa, itp ...
docker exec -ti my-container-name /bin/bash
Jeśli używasz django, na przykład, możesz przejść do katalogu django i zrobić manage.py shell
i zacznij grzebać w tym miejscu.
Mam podobną konfigurację, w której uruchamiam wiele usług internetowych przy użyciu django / selera / celerybeat / nginx / ...
Jednak z reguły uruchamiam jeden proces na kontener (wyjątek stanowią django i gunicorn uruchamiane w tym samym kontenerze). Następnie udostępniam rzeczy przy użyciu --volumes-from
.
Na przykład aplikacja gunicorn zapisuje do pliku .sock, a kontener ma własną konfigurację nginx; Kontener nginx ma --volumes-from
kontener django, aby uzyskać te informacje. W ten sposób mogę użyć kontenera nginx dla wszystkich moich usług internetowych.
Innym przydatnym narzędziem do debugowania jest zalogowanie sięstdout i używaj sterownika dzienników (splunk, logstash, itp.) do produkcji, ale miej go logując do kontenera podczas debugowania, dzięki czemu możesz uzyskać wiele informacji z "dzienników dokowania", kiedy masz go pod test. Jedną z największych zalet systemu dokowania jest możliwość pobrania kodu, który nie działa podczas produkcji, i uruchomienia go pod mikroskopem w celu przeprowadzenia debugowania.