訪問した特定のページまたは API エンドポイントに関する「ヒット」をログに記録して、統計や人気グリッドなどを入力する必要がある忙しい Web サイトがあります。ログに記録されたヒットは単純なページ ヒットではないため、ログを使用できません解析。
以前は、更新クエリを使用してデータベースに直接ログを記録していましたが、同時実行性が高いと、望ましくないデータベース負荷が発生します。
現在 Memcache を使用していますが、非アトミックな更新のために統計が正確ではないという問題が発生しています。
だから私の質問:
Memcache を引き続き使用する必要がありますが、アトミック インクリメントを改善する必要があります。
1) ページがヒットすると、「stats:pageid:3」などの memcache キーを作成し、アトミックにヒットするたびにこれをインクリメントします
2) すべての memcache キーを循環するバッチ スクリプトを作成し、10 分ごとにデータベースへのバッチ更新を作成します。
長所: 1 ページあたり 10 分に 1 回しか更新しないため、データベース ヒットが少なくなります (ただし、その 10 分間に多くのヒットがあります)。
短所: 個々のカウンターをアトミックにインクリメントできますが、どのページ ID がヒットしたかを保存し、ループしてログに記録するために memcache キーが必要です。これはアトミックではないため、データを DB にフラッシュしてすべてをリセットすると、このキーに物が残る可能性があります。最大 10 分のデータが失われる可能性があります。
またはキュー/タスク システムを使用します。
1) ページがヒットすると、ジョブがタスク キューに追加されます。2) タスク キューはレート制限され、バックグラウンドでこれらの「ヒット」をデータベースに処理します。
長所: コーディングが簡単で、必要に応じてキュー ワーカーをスケールアップできます。
短所:すべてのヒットを「合計」するのではなく、各タスクが個別に処理されるため、ヒットごとに 1 回データベースにヒットしています。
または他の提案はありますか?