2011-01-29 28 views
0

問候堆垛機。如何設計和測試rails中的併發數據_lots_?

我們正在開展一個項目,爲心理實驗參與者存儲第二至第二個跟蹤數據。我們目前的設計有一個Flash客戶端,它收集60秒的時間戳/活動配對,然後將數據作爲字符串以及一些參與者元數據發佈到我們的rails(3.0.3)/ MySQL(5.1)應用程序。 編輯我們使用vanilla Passenger/Nginx作爲前臺。軌道分割時間戳/活動串爲平行陣列,產生一個單一的原料SQL插入語句,然後猛推一切成塊狀表,即: (簡化的代碼)

@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時間間隔,以便傳入的數據分佈更均勻,但我仍然得到很多厄運和黯淡的預測。

我們還可以做什麼/我們應該如何改善此設計在rails中的可伸縮性?

我可以使用哪些工具/技術來準確預測這種情況在負載下的表現?

非常感謝。

回答

1

這是一個體繫結構問題而不是代碼問題。您的代碼看起來比較健全,並且只生成一個SQL查詢是一種好方法。但是,你的應用服務器是什麼?

如果您使用的是一臺瘦服務器,那麼當數據庫執行SQL查詢時,請求會阻塞,從而導致應用程序不響應。

使用乘客或獨角獸可以增加併發性,但每個請求的sql查詢仍然很慢。

如果您真的擔心該查詢,可以嘗試一箇中間Memcache或RabbitMQ圖層,它爲每個接收到的請求存儲作業。然後有一個後臺任務(或其中許多人)拿起並做慢插入。 Memcache和Rabbit比Mysql響應更快,並且您正在處理原始請求。

這意味着該請求會很快完成並將繁重的工作交給您的工作任務。延遲工作可能是一些看看,或工作,或兔子兔子/ EventMachine。

Memcache持久性可能是您的問題,所以如果您喜歡基於隊列的方法,我會推薦Rabbit。

最重要的是,你可以看看Apache的板凳,看你是如何真正做已經:

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

相關問題