私は9つのサービス、それぞれが独自のコンテナで実行していると言うマイクロサービスアーキテクチャを持っています。
このサービスでは、技術の組み合わせを使用していますが、主にDjango、Celery(Redis Queue)、共有PostgreSQLデータベース(独自のコンテナ内)、およびいくつかの特定のサービス/ライブラリがあります。
マイクロサービスは、REST APIを使用して相互に通信します。
問題は、時にはランダムな方法で、いくつかのコンテナAPIがそれ以上応答せず、固まってしまうことです。 私が curl
彼らのインターフェイス上で要求がタイムアウトになります。
その瞬間、他のすべての容器はうまく答えます。
2つのスタックしたコンテナがあります。 私が気づいたのは、 ブロッキング コンテナの使用:
- ジャンゴ
- django-rest-framework
- セロリ
- ジャンゴ・セロリー
- Celeryブローカーとしての組み込みRedis
- 別のコンテナにあるPostgreSQL DBへのアクセス
サービスまたはドッカーのログに関連する情報が表示されないため、問題のトラブルシューティング方法を把握することはできません。
問題は、これらのAPIがランダムな瞬間にだけスタックされていることです。再び機能させるには、ブロックするコンテナを停止し、再度起動する必要があります。
私はそれが Python GILの問題しかし、私はこの仮説をチェックする方法を知らない...
これをトラブルシューティングする方法についての任意のアイデアですか?
回答:
回答№1は0実行中のコンテナにシェルして物をチェックすることができます。セロリのプロセスはまだ実行中ですか?
docker exec -ti my-container-name /bin/bash
たとえば、djangoを使用している場合は、djangoディレクトリに移動して manage.py shell
そこを突き刺し始める。
私はdjango / celery / celerybeat / nginx /を使って複数のWebサービスを実行する同様の設定をしています。
しかし、原則としてコンテナごとに1つのプロセスを実行します(例外として、djangoとgunicornは同じコンテナで実行されます)。私はその後、 --volumes-from
.
たとえば、gunicornアプリケーションは.sockファイルに書き込み、コンテナには独自のnginx設定があります。 nginxのコンテナは、 --volumes-from
djangoコンテナはこの情報を取得します。そうすれば、すべてのWebサービスに在庫nginxコンテナを使用できます。
デバッグのもう一つの便利なことは、stdoutとdockerのログドライバ(splunk、logstashなど)を使用してデバッグするときにコンテナにログを記録するようにしてください。そうすれば、 "docker logs"から多くの情報を得ることができますテスト。ドッカーについての素晴らしい点の1つは、生産に失敗した正確なコードを取得し、それを顕微鏡で実行してデバッグすることです。