5

私はRubyonRailsアプリケーションを作成していますが、このWebサイトの最も重要な機能の1つはライブ投票です。わずか1分で10,000件の投票リクエストを受け取ることを完全に期待しています。他のリクエストと一緒に、それは私たちがたくさんのリクエストを受け取る可能性があることを意味します。

私の最初のアイデアは、apache + phusionを使用するようにサーバーを設定することですが、特に投票のために、サイドでphpスクリプトを記述し、memcachedで情報を読み書きすることを考えています。データは約15分間保持するだけでよいため、1分間に10,000回データベースに書き込むことは無意味に思えます。また、ユーザーのIPをマークして、2回投票しないようにする必要があります。これにより、memcachedでは非常に複雑になります。

誰かがこれを可能な限り最高に機能させるための提案やアイデアを持っているなら、助けてください。

4

1 に答える 1

7

この種の大規模な流入に対応するアプリを設計する場合は、アプリの重要なコンポーネントを最小限に抑える必要があります。

そのような強度で完全な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レイヤーをラップすることです。

于 2011-06-30T21:54:56.880 に答える