2016-09-13 1 views
0

私はFlask APIを持っています。キャッシュ目的でRedisクラスターに接続します。私は、各フラスコAPIコールでRedis接続を作成して破棄する必要がありますか?または、リクエスト間の接続を試して維持する必要がありますか?FlaskリクエストごとにRedisクラスタへの接続を行う必要がありますか?

2番目のオプションに対する私の議論は、私が実際にAPIを可能な限り無制限にしておかなければならないということです。スレッド間の競合やその他の副作用の原因になるかどうかはわかりません。

ただし、接続を永続化したい場合は、セッションまたはアプリケーションコンテキストに保存する必要がありますか。

答えて

2

これは性能と規模に関するものです。これら2つの流行語を鳴らすには、実際には永続的な接続が必要です。

最終的な競争条件は、すべての要求の再接続と変わらないので、問題ではありません。どのRCがどのようにレディスを使用しているかに依存しますが、キャッシュすればエラーの余地はあまりありません。

私は、クライアント側のPOVからAPIのステートレスな状態を理解していますが、サーバー側の意味を理解していません。

私はあなたがアプリケーションコンテキストではなく、セッション(それらは多すぎる可能性があります)ではなく、アプリケーションコンテキストに入れることをお勧めしますが、プロセスごとに最適な1接続を提供します。この方法をスケーリングするのは簡単です:あなたはredisボックスの最大接続数を打つことを心配する必要はありません。

+0

ありがとうございます、私はアプリケーションのコンテキストを試しましたが、要求の間には持続しません。リクエストでgから接続を引き出すたびに、Noneです。それは要求の後にそれを引き裂くようだ。 – user1658296

0

要求の間に開いたデータベースへの接続を維持することは、パフォーマンスの観点からは良い考えです。その理由は、接続の開始と終了がフリーではなく、リクエストが多すぎると問題になる可能性があるためです。データベースが特定の接続数までしか処理できないという別の問題があり、さらに開くとデータベースのパフォーマンスが低下するため、同時に開いている接続数を制御する必要があります。

これらの問題を解決するには、接続プールを使用することができます。接続プールには、多数の開いているデータベース接続が含まれており、それらにアクセスできます。接続からデータベース操作を実行するときは、プールから取得する必要があります。操作が完了したら、接続をプールに戻す必要があります。すべての接続が確立されたときに接続が要求された場合、呼び出し側は接続がプールに返されるまで待機する必要があります。この処理では新しい接続が開かれていないので(あらかじめすべて開かれています)、これによりデータベースに並列接続が多すぎることがありません。

接続プールが正しく使用されている場合、1つのスレッドのみが1つの接続を使用して、いつでも使用します。

接続プールには状態(現在どの接続が使用されているかを記録する必要があります)がありますが、APIはステートレスになります。これは、APIの観点からは、「ステートレス」とはAPIユーザーに状態/副作用がないことを意味するためです。サーバーは、ログファイルへの書き込みやキャッシュへの書き込みなどの内部状態を変更する多くの操作を実行できますが、API呼び出しに対する返信として返されるデータには影響しないため、このAPIを「ステートフル」にすることはできません。

Redis接続プールhereを使用した例がいくつかあります。

どこに格納するかについては、purposeの方が適しているため、アプリケーションコンテキストを使用します。

関連する問題