この種の大規模な流入に対応するアプリを設計する場合は、アプリの重要なコンポーネントを最小限に抑える必要があります。
そのような強度で完全なRailsスタックを使用することは、実際には実用的ではなく、必要でもありません。INSERT
基本的にステートメントのラッパーであるORMをスキップして、直接DB呼び出しを行うことにより、投票を処理する非常に薄いRackレイヤーを構築する方がはるかに優れています。これは、効率的なクエリジェネレータとして機能するSinatraとSequelが役立つ可能性があるものです。
また、データベースを適切に調整し、データベースに対して多くの負荷テストを実行して、負荷が高くなるための十分なマージンを確保して、期待どおりに実行されることを確認する必要があります。
1分間に10,000回のDB呼び出しを行うことは大したことではありません。適切に調整されたスタックでは、各呼び出しにかかる時間はわずか1ミリ秒です。Memcachedは、特に結果が永続的であることを意図していない場合に、より高いパフォーマンスを提供する可能性があります。Memcachedにはアトミックインクリメント演算子があります。これは、投票を単純に集計するときにまさに探しているものです。Redisは非常に有能な一時的なストアでもあります。
もう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
これを1秒間に数十万回実行することは完全に実用的であるため、唯一のオーバーヘッドはJSONレイヤーをラップすることです。