0

訪問した特定のページまたは API エンドポイントに関する「ヒット」をログに記録して、統計や人気グリッドなどを入力する必要がある忙しい Web サイトがあります。ログに記録されたヒットは単純なページ ヒットではないため、ログを使用できません解析。

以前は、更新クエリを使用してデータベースに直接ログを記録していましたが、同時実行性が高いと、望ましくないデータベース負荷が発生します。

現在 Memcache を使用していますが、非アトミックな更新のために統計が正確ではないという問題が発生しています。

だから私の質問:

Memcache を引き続き使用する必要がありますが、アトミック インクリメントを改善する必要があります。

1) ページがヒットすると、「stats:pageid:3」などの memcache キーを作成し、アトミックにヒットするたびにこれをインクリメントします

2) すべての memcache キーを循環するバッチ スクリプトを作成し、10 分ごとにデータベースへのバッチ更新を作成します。

長所: 1 ページあたり 10 分に 1 回しか更新しないため、データベース ヒットが少なくなります (ただし、その 10 分間に多くのヒットがあります)。

短所: 個々のカウンターをアトミックにインクリメントできますが、どのページ ID がヒットしたかを保存し、ループしてログに記録するために memcache キーが必要です。これはアトミックではないため、データを DB にフラッシュしてすべてをリセットすると、このキーに物が残る可能性があります。最大 10 分のデータが失われる可能性があります。

またはキュー/タスク システムを使用します。

1) ページがヒットすると、ジョブがタスク キューに追加されます。2) タスク キューはレート制限され、バックグラウンドでこれらの「ヒット」をデータベースに処理します。

長所: コーディングが簡単で、必要に応じてキュー ワーカーをスケールアップできます。

短所:すべてのヒットを「合計」するのではなく、各タスクが個別に処理されるため、ヒットごとに 1 回データベースにヒットしています。

または他の提案はありますか?

4

1 に答える 1

1

または: StatsD & Graphiteなど、高トラフィック レベルで統計を記録するように設計されたものを使用します。元の StatsD は NodeJS の上に Javascript で記述されているため、セットアップが少し複雑になる可能性があります (ただし、Docker コンテナーを使用して簡単にインストールする方法があります)。GoLang で書かれたものと同じ機能を実行します。

私は元の StatsD と Graphite のペアを使用して大きな効果を上げました。さらに、きれいなグラフを作成しています (これは、1 日あたり数千万のイベント用でした)。

于 2013-10-10T12:09:12.030 に答える