2017-01-05 6 views
1

9つのサービスをそれぞれ独自のコンテナ内で実行するというマイクロサービスアーキテクチャがあります。Dockanger ContainerのDjango + CeleryのAPIタイムアウトのトラブルシューティング

これらのサービスでは、Django、Celery(Redis Queue)、共有PostgreSQLデータベース(独自のコンテナ内)、およびいくつかの特定のサービス/ライブラリを使用しています。

マイクロサービスは、REST APIを使用して互いに通信します。

問題は、ランダムな方法で、いくつかのコンテナAPIが応答しなくなってスタックしないことがあることです。 自分のインタフェースでcurlリクエストを発行するとタイムアウトになります。

その瞬間、他のすべての容器はうまく答えます。

2つの張り出した容器があります。 私が気づいたことはブロックコンテナの両方を使用することです:

  • ジャンゴ
  • ジャンゴ休止フレームワーク
  • セロリ
  • ジャンゴ・セロリ
  • セロリブローカーなどの組み込みのRedis
  • 別のコンテナにあるPostgreSQL DBへのアクセス

サービスまたはドッカーのログに関連情報が表示されないため、問題のトラブルシューティング方法を理解できません。

問題は、これらのAPIがランダムな瞬間にだけスタックされていることです。もう一度動作させるには、ブロッキングコンテナを停止してから、再度起動する必要があります。

それはのpython GIL問題ことができれば、私は思っていたが、私はこの仮説をチェックする方法がわからない...

これをtroubleshotする方法についての任意のアイデア?

+1

一般的なプラクティスはコンテナあたり1デーモンです – e4c5

+0

私は同じコンテナ内でフォアグラウンド(nginx/gunicorn/celery/redis)でいくつかのデーモンを実行します。 – matt

+0

と私はドッカーを使用することの全目的を破ると言っています。なぜあなたはホストOS上でこれらのすべてのものを直接実行しないのですか? – e4c5

答えて

0

実行中のコンテナにシェルして物をチェックすることができます。あなたはジャンゴを使用している場合、たとえば、あなたがDjangoのディレクトリに移動し、manage.py shellを行うと、そこにチャンスをうかがっ開始することができます...等、セロリプロセスがまだ実行されている

docker exec -ti my-container-name /bin/bash

です。

私は例外の種類は、ジャンゴとgunicornである(原則として、私はコンテナごとに1つのプロセスを実行し、しかし、私はジャンゴ/セロリ/ celerybeat/nginxの/ ...

を使用して、複数のWebサービスを実行して同様に設定して同じ容器に入れてください)。私は--volumes-fromを使って物事を共有します。

たとえば、gunicornアプリケーションは.sockファイルに書き込みます。コンテナには独自のnginx設定があります。 nginxコンテナは--volumes-from djangoコンテナを使用してこの情報を取得します。そうすれば、すべてのWebサービスに在庫nginxコンテナを使用できます。

デバッグのもう一つの便利なことは、stdoutにログを記録して、本番用にdockerのログドライバ(splunk、logstashなど)を使用することですが、デバッグ時にコンテナにログを記録します。そうすれば、テスト中に「ドッカーログ」から多くの情報を得ることができます。ドッカーについての素晴らしい点の1つは、生産に失敗した正確なコードを取得し、それを顕微鏡で実行してデバッグすることです。

+0

あなたの答えはRyanに感謝します。 *「ただし、原則としてコンテナごとに1つのプロセスを実行します」*:コンテナごとに複数のプロセスを実行することは推奨されていませんか?これは物事がうんざりすることを含むか? 私のコンテナは、このようなプロセスを実行するために使用されます(Phusion Dockerイメージからインスピレーション) 'my_init --- runsvdir - + - runsv | -runsv --- run --- filebeat --- 9 * [{filebeat} ] '-runsv --- run --- supervisord - + - gunicorn --- gunicorn ' -nginx --- 4 * [nginx] ' – matt

+0

実際には、コンテナごとに1つのプロセスを保持する方が簡単です。これは、コードの更新やnginxなどの再起動が必要な場合はdjangoコンテナを配備する必要があるなどのように、モジュール化され、構成が簡単で、デバッグが簡単で、配備が簡単です。既存のアプリケーションをドッキングしようとすると、コンテナごとに複数のプロセスがあり、通常は問題にぶつかります。 –

関連する問題