4

Web サイトでの検索を高速化するために、ホストされている Elastic Search プロバイダーへの接続を管理する方法が必要です。Found ElasticSearch アドオンと、ElasticSearch Python ライブラリである pyes を使用して、Heroku で Django を実行しています。

pyes を使用して ElasticSearch への接続を設定する標準的な方法は、次のようにプロバイダー URL を ES オブジェクトに渡すことです。

(1)connection = ES(my_elasticsearch_url)

Pyes はバックグラウンドで ES オブジェクトを使用して、ElasticSearch プロバイダーへのオープンな HTTP 接続を確立するため、次のような検索を実行できます。

(2)results = connection.search(some_query, index_name)

以前は、検索用の Django ビューでこれらの両方の手順を実行していました。ユーザーが検索を行うたびに、新しい HTTP 接続を開いて検索を実行していました。その結果、検索呼び出しが遅くなりました。

(1) をアプリの__init__.pyファイルに移動することで検索を高速化しました。今では、接続を 1 回だけ設定し、それを検索ビューにインポートしています。しかし、多くの人が一度に検索しようとすると、その HTTP 接続が詰まらないのではないかと心配しています。

接続のプールを設定し、アプリの起動時に一度開始し、必要に応じて検索ビューに表示する方法についてのアイデアを探しています。理想的には、コードの変更を最小限に抑えて、プールのサイズを簡単に拡大縮小できるようにしたいと考えています。

これにアプローチする方法はいくつか考えられますが、コンピューティングに関連する一般的な問題のように思われるため、そのようなシステムの優れた設計とベスト プラクティスについて多くのアイデアを持っていると確信しています。私はそれらを聞きたいです。

どうもありがとう!

粘土

4

1 に答える 1

1

マルチスレッド環境で実行している場合Queue.Queue、ビューが要求応答フローを処理している複数のスレッドから、必要に応じて接続を取得してインスタンス化できるインスタンスを作成するために拡張するだけです。キューの最大サイズを制限することで、保持する接続の数に一定の上限を設定することをお勧めしますが、それを超える接続をインスタンス化し、それらをキューに戻すことができる場合は単純に破棄することができます。

使用の欠点はQueue.Queue、ビューが接続を取得してキューに戻す責任がある場合、横断的な問題が発生する可能性があることです。pyes.ES接続を保持する実際のオブジェクトのみをキューに入れ、そのためのラッパーを作成すると、より健全な設計を得ることができますES。クエリを実行するとき、新しいESインスタンスを作成し、キューから接続をフェッチし、インスタンスに設定し、接続をキューに戻し、ESインスタンスを破棄して、クエリ結果を返します。

于 2012-10-22T07:41:58.793 に答える