2013-05-30 69 views
0

我正在基於angularjs和rails的單頁應用程序。我使用RABL來呈現JSON文件。 很多JSON響應需要這樣的渲染JSON:嵌套的屬性或不同的請求?

 child :tags do 
     attributes :id, :name 
    end 

    child webapp.comments do |t| 
        // with other nested attributs like user for comments... 
     extends "comments/index" 
    end 


    child webapp.category do |t| 
     attributes :id, :name 
    end 

    child webapp.user do |t| 
     extends 'users/show-lazy' 
    end 

    node(:image_url) { |webapp| webapp.image_url(:medium) } 

我有一些性能問題,因爲由Rabl的渲染視圖花費大約800毫秒的嵌套屬性(一個用戶請求!)(活動記錄,只需50毫秒)。它太長了。我還沒有激活緩存。據在Github上https://github.com/nesquena/rabl/issues/49此相關的問題,嵌套的屬性可以減緩渲染...

我的問題:如果代嵌套屬性需要很長一段時間,是它更好地發送不同的要求,如: GET/myresource GET /評論/:id/myresource get/tags /:id/myresource

您的意見是?

+0

答案將取決於很多事情......有多少延遲是網絡與服務器相關的,有多少數據,有多少控制你對API等等。我更喜歡當我分塊時可以在需要詳細信息之前向用戶顯示某些內容。 – Sharondio

回答

1

如果生成嵌套屬性需要很長時間,發送不同的請求會更好嗎?

這取決於:

  • 如果客戶將不得不做出這些要求馬上和速度是一個問題,那麼這將取決於是否所有這些請求都可以之前得到處理一個請求可能已經被處理。這取決於您處理請求的服務器數量以及是否可以一次處理多個請求(或幾乎同時處理)。

  • 如果客戶不需要這些其他資源,甚至可能不需要它們,那麼單獨的請求可能會更好,但它會影響客戶端的設計,所以您必須考慮到這一點。

有可能我錯過了其他的事情,但這些是初學者的兩個。

做更多的事情:

  • 你可以使用include:/.includes(...)或加入(收費)查詢,以減少N + 1?

  • 你是否也看過JBuilderActiveModel::Serializers作爲RABL的替代品? JBuilder是Rails 4的一部分,ActiveModel :: Serializers由一些Rails核心團隊成員開發。

  • 留意json-api項目(同樣在github,您可以提供反饋)。

  • 如果您想避免大量服務控制器實施,請查看restful_json

+0

我用過包括:。最後,我決定切換到ActiveModel :: Serializers。我的迴應速度從800毫秒增加到350毫秒! 不幸的是,緩存系統似乎並沒有被ActiveModel :: Serializers實現。所以,我會看看JBuilder! – vpoulain