2011-06-30 8 views
5

私はRubyアプリケーションでRubyアプリケーションを作成しています。このウェブサイトの最も重要な特典の1つはライブ投票です。わずか1分で1万件の投票リクエストを受けることができます。他の要求と並んで、私たちは多量の要求を得ることができます。数百の同時リクエストをレールで処理する

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

できるだけこの作業を行うための提案やアイディアがあれば、助けてください。

+0

NoSQL dbsと10kの書き込みは1秒あたり約165回の書き込みとなります。それほど多くはありません。 – Viktor

+0

私はそれを考えていませんでしたが、あなたがお勧めする最も信頼できるものは何ですか? –

+0

MongoDB for NoSQL。 MySQLを使用している場合は、MyISAMテーブルを使用します。 – Dex

答えて

7

このような大規模な流入のためのアプリを設計する場合は、その必須コンポーネントを絶対最小限にする必要があります。

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

+1

偉大な応答に感謝します。私はおそらくイベントマシンをテストし、Sinatra + memcachedはあまりにも多くの余分な作業のコーディングも必要とせずに本当に効率的であるように思われます。つまり、これは単一の機能のためですが、独自の解決策が必要となるような高い要件です。 –

関連する問題