制約と仕様がまだ設定されていない新しいプロジェクトの調査を行っています。必要なことの 1 つは、ルート ドメインの直下にある多数のパスです。これは、数百万のパスにまで増加する可能性があります。パスには共通の構造や独自の部分がないため、完全に一致するものを探す必要があります。
これらのパスを分割する方が効率的であることがわかりました。これは、パスの検索にも役立ちます。ただし、ここで可能性を調査しているので、ご容赦ください。
優れたパフォーマンスを維持しながら、これを達成する方法を評価しています。以下の方法を考えました。
- パスを SQL データベースに保存し、リクエストごとにルックアップを実行します。これは最悪のオプションのように思われ、絶対に使用されません。
- Redis などのキー値ストアにパスを格納します。これははるかに優れており、非常にうまく機能すると思います(ただし、ベンチマークする必要があります)。
- 文字列/正規表現のマッチングを行う - 多くのフレームワークがすぐに使用できるように - この量の可能な一致はナッツであり、実際にはオプションではありません。しかし、スマートな最適化と組み合わせて、文字ごとに比較するある種のアルゴリズムを実行すると、どのように機能するかを見ることができました。
しかし、この種の問題により適した、私が知らないツール/方法があるかもしれません。ただし、これを達成する方法についてのヒントを使用できます。
ああ、誰かが疑問に思っている場合に備えて、いいえ、これは宿題ではありません.
アップデート
Redis アプローチをテストしました。2 セットのキーワードに基づいて、1 億 5000 万のパスが得られました。コマンドを使用してそれぞれを追加しましset
た。値は、リクエスト内の実際のキーワードを識別するために使用できる ID のシリアル化された文字列です。( SET 'keyword1-keyword2' '<serialized_string>'
)
100 万レコードのデータ セットを使用したローカル VM でのクイック テストでは、有望な結果が返されました。そして、これは他の多くのものを実行する私のラップトップにありました。
次に、4 コアと 8 GB の RAM を備えた VPS で、1 億 5000 万のレコードの完全なセットで完全なテストを行いました。これにより、ファイル サイズが 3.1G、メモリが約 9GB のデータベースが生成されました。データベースを完全にメモリにロードできなかったため、Redis はスワッピングを開始し、平均で約 100 ミリ秒というひどい結果を引き起こしました。
明らかに、これは機能せず、適切にスケーリングされます。これには、各 Web サーバーに膨大な量の RAM が必要になるか、専用の Redis ルーティング サーバーを使用する必要があります。データベースのサイズを劇的に縮小する方法を考案した Instagram のエンジニアの記事を読んだことがありますが、まだ試していません。いずれにせよ、これはこれを行う正しい方法ではないようです。ふりだしに戻る。