2011-01-29 5 views
0

ご挨拶スタッカー。並行データの_lots_をレールで設計してテストする方法は?

私たちは、精神実験の参加者のための2番目から2番目の追跡データを保存するプロジェクトに取り組んでいます。現在の設計では、60秒間のタイムスタンプ/アクティビティのペアリングを収集し、データを文字列として投稿するFlashクライアントと、参加者のメタデータをレール(3.0.3)/ MySQL(5.1)アプリケーションに投稿しています。 を編集するフロントにはバニラのPassenger/Nginxを使用しています。レールは、平行配列にタイムスタンプ/活性文字列を分割し、単一の生SQL INSERTステートメントを生成し、大規模なテーブルにすべてを突きつけ、すなわち: (簡略化コード)

@feedback_data = params[:feedbackValues].split(",") 
@feedback_times = params[:feedbackTimes].split(",") 
inserts = [] 
base = "(" + @userid + "," + @studyid + "," 
@feedback_data.each_with_index do |e,i| 
    record = base + @feedback_times[i].to_s + "," 
    record += "'" + @feedback_data[i].to_s + "')" 
    inserts.push(record) 
end 
sql = "INSERT INTO excitement_datas (participantId, studyId, timestamp, activityLevel) VALUES #{inserts.join(", ")}" 
ActiveRecord::Base.connection.execute sql 

収量:

INSERT INTO STUDY_DATA (participantId, studyId, timestamp, activityLevel) 
VALUES (3,5,2011-01-27 05:02:21,47),(3,5,2011-01-27 05:02:22,56),etc. 

デザインはチームについて多くの議論を引き起こしています。研究には10人または100人の同時参加者がいます。着信データがより均等に分散されるように、各クライアントの60秒のPOST間隔をずらしていますが、私はまだ多くの運命と暗い予測を得ています。

レールでこのデザインのスケーラビリティを向上させるために、他に何ができるのですか?

これが負荷のもとでどのように実行されるかを正確に予測するために使用できるツール/テクニックは何ですか?

多くのありがとうございます。

答えて

1

これは、コードの問題よりもアーキテクチャ上の問題です。あなたのコードは正気に見えますが、SQLクエリを1つだけ生成するのは良いアプローチです。しかし、あなたのアプリケーションサーバーは何ですか?

たとえば、1台のシンサーバーを使用している場合、データベースがSQLクエリを実行している間に要求がブロックされ、応答の遅いアプリケーションが発生します。

PassengerまたはUnicornを使用すると、並行性は向上しますが、要求ごとに非常に遅いSQLクエリが発生します。

本当にそのクエリを心配している場合は、受信したリクエストごとにジョブを保存する中間のMemcacheまたはRabbitMQレイヤを試すことができます。その後、バックグラウンドタスク(またはそれらの多く)が遅い挿入を受け取り、実行します。 MemcacheとRabbitはMysqlよりも反応がよく、あなたは生のリクエストを処理しています。

これは、要求が非常に迅速に完了し、作業負荷の高い作業を手渡すことを意味します。遅れた仕事は、ウサギのために見えるもの、またはWorkling、またはBunny/EventMachineである可能性があります。

Memcacheの永続性が問題になる可能性があるため、キューベースの手法を魅力的にするには、Rabbitをお勧めします。

その上で、あなたが実際にすでにやっているかを確認するために、Apacheのベンチで見ることができる:

http://httpd.apache.org/docs/2.0/programs/ab.html

関連する問題