7

私の Web アプリには、私が制御できない外部 API から収集されたデータが含まれています。1 時間あたり約 20,000 件の API リクエストに制限されています。データベースには約 250,000 のアイテムがあります。これらの各アイテムは、基本的にキャッシュされたバージョンです。1 つのアイテムのキャッシュを更新するのに 1 つのリクエストが必要であると考えてください。明らかに、これらの状況下で完全に最新のキャッシュを持つことは不可能です。では、データをキャッシュするための戦略を策定する際に考慮すべきことは何ですか。これらは頭に浮かぶものですが、誰かが私が考えていなかった良いアイデアを持っていることを願っています.

  • アイテムが作成されてからの時間 (時間が短いほど重要)
  • 特定のアイテムが持っている「いいね」の数 (表示される可能性が高いことを意味する可能性があります)
  • 最終更新からの時間

いくつかの詳細: アイテムは写真です。すべての写真はイベントに属しています。現在発生しているイベントは、クライアントによって表示される可能性が高くなります (したがって、イベントを優先する必要があります)。現在、データベースには 25 万項目しかありませんが、その数はかなり急速に増加しています (100 万点に達するまで、おそらく 5 か月かかるでしょう)。

4

2 に答える 2

5

http://instagram.com/developer/realtime/は役に立ちますか? Instagram は、あなたがチェックアウトできる新しい (そしておそらく更新された?) 画像があると、あなたのサーバーに POST しようとしているようです。それはトリックを行いますか?

それ以外の場合、あなたの問題は検索エンジンの問題とよく似ていると思います。クローラーの選択基準に関するウィキペディアを見たことがありますか? Web クローラーが直面する多くの問題に対処しなければなりません。つまり、何をクロールするか、クロールする頻度、個々のサイトへの要求が多すぎないようにする方法などです。学習できるコードとアルゴリズムについては、(同じページにある)オープンソースのクローラーを参照することもできます。

とにかく、クロールの標準についていくつかの考えを捨てるには:

  • 更新時に頻繁に変更されたものを更新します。そのため、過去 5 回の更新で項目が変更されていない場合は、それほど頻繁には変更されないと想定して、更新を減らすことができます。
  • 各画像のスコアを作成し、スコアが最も高いものを更新します。または最低スコア (使用しているスコアの種類によって異なります)。これは、LilyPond が音楽をタイプセットするために使用するものと同様の考え方です。このようなスコアの入力を作成するいくつかの方法:
    • イメージが更新され、再キャッシュが必要になる可能性を示す統計モデル。
    • 画像の新しさ、またはそのイベントの通貨などを使用した、各画像の重要度スコア。
  • よく閲覧されているものを更新します。
  • 多くのビューを持つものを更新します。
  • 時間は画像が更新される確率に影響しますか? 新しい画像ほど重要だとおっしゃいましたが、古い画像が変更される可能性はどうでしょうか。古いイメージのチェックの頻度を遅くします。
  • リクエストの一部をすべてをゆっくりと更新するように割り当て、他の部分を分割して複数の異なるアルゴリズムからの結果を同時に処理します。したがって、たとえば、次のようにします (数字は表示/例のみです。帽子から引き出しただけです)。
    • データベースのコンテンツ全体を 1 時間あたり 5,000 リクエスト (クローラーが最後に通過してから更新されていない場合)
    • 新しい画像を処理する2,500のリクエスト(あなたが言及したことはより重要です)
    • 現在のイベントの画像を処理する 2,500 件のリクエスト
    • 2,500 リクエストで、最も閲覧数の多い上位 15,000 の画像を処理します (その画像の最後の 5 つのチェックで変更があった場合、そうでない場合は、減少するスケジュールでチェックします)。
    • 少なくとも閲覧された画像を処理する 2,500 件のリクエスト
    • 合計: 1 時間あたり 15,000 リクエスト。
于 2013-06-18T23:49:02.237 に答える