4

基本的に、私が追跡したいいくつかの指標の一部は、特定のオブジェクトが当社のマーケティング プラットフォームで受け取るインプレッションの量です。たくさんのオブジェクトを表示するとしたら、オブジェクトが提供されるたびに追跡したいと思います。

すべてのオブジェクトは、単一のゲートウェイ/インターフェースを介してクライアントに返されます。したがって、ある検索条件を含むページに対するリクエストが届いたと想像すると、その検索リクエストは Solr インデックスにプロキシされます。

その後、10 個の結果が返されます。

これらの 10 の結果のそれぞれが印象として見なされます。

信じられないほど高速で正確な実装を見つけるのに苦労しています。

これを行う方法について何か提案はありますか? テクノロジーはいくつでも投入できます。現在、Gearman、PHP、Ruby、Solr、Redis、Mysql、APC、および Memcache を使用しています。

最終的には、すべてのインプレッションが最終的に mysql に永続化されるはずです。これは 1 時間ごとに行うことができます。しかし、実際の検索リクエストの読み込み時間に影響を与えることなく、インプレッションをメモリに高速に保存する方法がわかりません。

アイデア (オプション 4 と 5 を追加しただけです)

  1. 結果がクライアントに返されると、クライアントはプラットフォーム上で base64 でエンコードされた URI を要求します。これには、提供されたすべてのオブジェクトの ID が含まれています。次に、このオブジェクトが gearman に渡され、gearman がカウントを redis に保存します。1 時間に 1 回、redis がフラッシュされ、mysql 内のオブジェクトごとにカウントが増分されます。

  2. Solr から結果が返されたら、ループして Redis に直接保存します。(速度についてはこれをベンチマークしていません)。1 時間ごとに mysql へのフラッシュを繰り返します。

  3. Solr からアイテムが返されたら、すべての ID を 1 つのジョブで Gearman に送信します。これにより、Redis に送信されます。

  4. 新しいアイデア返される項目の最大数は約 20 であるため、返された ID の base64 ヘッダーを使用して X-Application-Objects ヘッダーを設定できます。これらの ID (ヘッダー内) は nginx によって取り除かれ、カスタム LUA nginx モジュールを使用して、ID を nginx から Redis に直接書き込むことができました。これはやり過ぎかもしれませんが。ただし、これの利点は、nginx が redis に書き込んでいる間、すぐに応答オブジェクトを返すように指示できることです。

  5. 新しいアイデアリクエストを nginx にフラッシュバックするために使用fastcgi_finish_request()しますが、結果を Redis に挿入します。

  6. 他の提案はありますか?

編集して質問に答える:

このデータの信頼性は必須ではありません。それが最良の推測である限り。インプレッションが 30% 減少するような変動は見たくありません。しかし、10% -/+ acurracy の許容範囲は許容します。

4

2 に答える 2

2

あなたの2つの最良の選択肢は次のとおりです。

  1. インクリメント コマンドを使用して、ディスをプルするときにカウンターをインクリメントします。Id をキーとして使用し、Redis でインクリメントします。Redis は 1 秒あたり数十万回のインクリメントを簡単に処理できるため、クライアントに顕著な影響を与えることなく十分に高速に処理できます。PHP 言語バインディングがサポートしている場合は、各リクエストをパイプライン処理することもできます。そうだと思います。

  2. redis をプレーン キャッシュとして使用します。このオプションでは、単純に Redis リストを使用して、たとえば で区切られた ID を含む文字列の rpush を実行します。コンマ。時刻をキーとして使用できます。次に、前の時間を取得して、必要に応じて MySQL にマッサージすることにより、別のプロセスでそれを引き出すことができます。キーに有効期限を設定して、一定期間後にキーを消去するか、後処理プロセスでキーを削除してください。

また、非常に高い redis トラフィックがある場合、またはオフロードしておまけとしてバックアップを取得したい場合は、読み取りスレーブを使用して MySQL へのエクスポートを行うこともできます。これを行うと、マスター redis インスタンスをディスクにフラッシュしないように設定できるため、書き込みパフォーマンスが向上します。

この種の追跡のための redis の機能のより拡張された使用に関するいくつかの追加オプションについては、この回答を参照してください。また、MySQL の部分を避けて redis からデータをプルし、システム全体をよりシンプルに保つこともできます。

于 2012-07-14T15:43:22.070 に答える
0

#2のようなことをして、Redisカウンターを更新するためにできる最速のキューにデータを渡します。私はギアマンにそれほど精通していませんが、これには遅いと思います。Redisクライアントが非同期書き込みをサポートしている場合は、それを使用するか、別のスレッドのキューに入れます。カウンターの更新を待っている応答を遅くしたくありません。

于 2012-07-14T02:08:30.583 に答える