/ / Rozwiązywanie problemów z limitem czasu interfejsu API z Django + Seler w Docker Container - python, django, docker, kontenery, seler

Rozwiązywanie problemów z limitem czasu interfejsu API z Django + Seler w Docker Container - python, django, docker, kontenery, seler

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 № 1

Moż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.