このような大規模な流入のためのアプリを設計する場合は、その必須コンポーネントを絶対最小限にする必要があります。
この種の強度のために完全なRailsスタックを使用することは、実際的ではなく、必要でもありません。基本的にINSERT
ステートメントのラッパーであるORMでもスキップして、直接DB呼び出しを行うことで、投票を処理する非常に細いRackレイヤーを構築する方がはるかに良いでしょう。これはSinatraとSequel(効率的なクエリジェネレータとして役立つ)が役に立ちます。
また、データベースを適切にチューニングし、予想通りに多くの負荷テストを実行して、より高い負荷のために十分なマージンを確保してください。
1分間に10,000回のDB呼び出しを行うことは大したことではなく、適切に調整されたスタックでわずか1ミリ秒で終了します。 Memcachedは、結果が永続的なものではない場合に特に高いパフォーマンスを発揮する可能性があります。 Memcachedにはアトミックインクリメント演算子があります。これは単純に投票を集計するときに探しているものとまったく同じです。レディスはまた、非常に有能な一時的な店です。
もう1つのアイデアは、DB全体をスクラップし、単純なJSONベースのプロトコルを使用する永続的なサーバープロセスを作成することです。 EventmachineはRubyにコミットしているならば、これらのことを一緒にスローするのに最適です.JavaScriptで専用のタリー・サーバーを構築したい場合はNodeJSもそうです。
完全なDBスタックのオーバーヘッドなしに、特殊なサーバープロセスを使用している適度なハードウェアでも、1分で10,000の操作を簡単に達成できます。
スコープが非常によく定義されていることを確認するだけで、導入前に実装をテストし重度に悪用することができます。
あなたが記述しているものを、非常にコア、ハッシュ・ルックアップに相当なもので、基本的なコードは単純なので:
contest = @contest[contest_id]
unless (contest[:voted][ip])
contest[:voted][ip] = true
contest[:votes][entry_id] += 1
end
はこの数十万回を実行する第二では、完全に実用的です唯一のオーバーヘッドは、その周りにJSONレイヤーをラップすることです。
NoSQL dbsと10kの書き込みは1秒あたり約165回の書き込みとなります。それほど多くはありません。 – Viktor
私はそれを考えていませんでしたが、あなたがお勧めする最も信頼できるものは何ですか? –
MongoDB for NoSQL。 MySQLを使用している場合は、MyISAMテーブルを使用します。 – Dex