[英]Optimising Rails dynamic JSON CPU/memory intensive operations (caching?)
我們建立了一個帶有Angular前端和RoR后端的動態問卷。 由於要處理的動態部件很多,因此無法利用ActionView或jbuilder緩存幫助器。 對於每個“問卷”請求,都有很多查詢需要完成,例如檢查答案的有效性,檢查依賴項等。是否有建議的策略來緩存動態JSON響應?
給一個想法
控制器代碼:
def advance
# Decrypt and parse parameters
request = JSON.parse(decrypt(params[:request]))
# Process passed parameters
if request.key?('section_index')
@result_set.start_section(request['section_index'].to_i)
elsif request.key?('question_id')
if valid_answer?(request['question_id'], request['answer_id'])
@result_set.add_answer(request['question_id'],
request['answer_id'],
request['started_at'],
request['completed_at'])
else
return invalid_answer
end
end
render_item(@result_set.next_item)
end
next_item
可以是問題或部分,但進度指示器數據以及可能先前給出的答案(可以導航)也將返回。 而且,數據是從前端加密發送到前端的。
我們還建立了一個具有Angular前端的管理區域。 在該區域中,可以查看和比較調查表的結果。 正在進行一些查詢以找到子問題,可比較的問題等。我們發現這些問題很難緩存。 在同時單擊多個用戶后,您可以填滿服務器的內存。
該應用程序已部署在Passenger上,我們已經根據服務器配置對配置進行了微調。 結果存儲在Postgres數據庫中。
TLDR:在生產中,我們發現內存使用成為問題。 可以對查詢進行一些優化(特別是包括在內),但是是否存在建議的策略來緩存動態JSON響應?
沒有太多關於如何存儲和檢索數據的細節,這有點困難。 但是聽起來您在說的是,您的next_item
方法需要占用大量CPU和內存,才能查找下一項。 那是對的嗎? 假設您想看一下鏈表 。 每個節點(多態)將具有到下一個節點的鏈接。 如果需要前進和后退,可以將其實現為雙向鏈接列表。
數據多久更改一次? 如果您可以緩存其中的大部分內容,並且會找到一個觸發器屬性(例如updated_at
),則可以在視圖中進行片段緩存。 甚至更好的是在控制器中進行HTTP緩存。 您可以將兩者混合使用。
這有點復雜。 請查看http://www.xyzpub.com/en/ruby-on-rails/4.0/caching.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.