1

SQLデータベースを使用した高負荷のWebアプリケーション開発のアプローチについて質問したいと思います。さまざまな記事へのアクセスを提供する単純なCMSシステムがあると仮定します。また、記事の訪問数をデータベースに保存したいと思います。この訪問カウンターは、ユーザーが記事を見るたびに増加します。

SQLデータベースに関しては、テーブル「Article」に「visits」整数フィールドがあり、ユーザーが記事にアクセスするたびに増やす必要があります。記事に多数の同時訪問がある場合は、現在のデータベース行の「訪問」フィールド値を正しく変更する必要があります。

私は悲観的なロックアプローチを使用します:「SELECT..FORUPDATE」。ユーザーが記事にアクセスするたびに、「記事」テーブルの特定の行をロックし、「訪問」カウンターを増やします。

このアプローチは正しいですか?

プロジェクトでMySQLデータベースを使用しています。

4

2 に答える 2

2

このアプローチは中負荷のサイトでは機能しますが、最終的にはロックの問題が発生します。

非常に負荷の高いWebサイトでは、メッセージキューを実装し、「訪問済み」イベントをキューに送信する必要があります。

オフラインプロセスはキューを読み取り、列を適切に更新します。これにより、いつでも1つのプロセスだけがその特定の列にアクセスできるようになります。

于 2010-11-21T22:48:03.833 に答える
2

記事データに集計データ (「訪問数」など) を保存することは絶対にお勧めしませんが、訪問ごとに 1 つの新しいレコードを記録する別のテーブルを使用してください。タイムスタンプ、article_id、IP アドレス、その他のデータをそこに保存します。この背後にある理論的根拠は、アクセスごとに各記事のデータベース レコードをロックする必要がないためです。これにより、ロックの問題や競合が発生する可能性があります。

ここで、ビューの数を取得することに関心がある場合は、ログ テーブルで単純な選択を行います。「十分」な中規模のサイト向け。負荷が増加するにつれて、記事ごとのビュー数を定期的に計算し、ビュー カウンターをキャッシュして、このデータへのアクセスを高速化する必要があります。

于 2010-11-22T17:43:08.347 に答える