2010-11-21 11 views
1

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

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

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

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

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

答えて

2

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

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

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

+0

数値による負荷範囲を指定できますか?それは素晴らしいでしょう。 – benjamin

2

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

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

+0

FlySwatが書いたように、記事へのロギングアクセスは、キューに書き込んでからバッチ処理を行うことによっても可能です。それでも、ビューが発生するたびに記事テーブルを更新して記事レコードをロックする必要があるという欠点があります。 – mhanisch

関連する問題