【问题标题】:Render JSON : nested attributes or different requests?渲染 JSON:嵌套属性还是不同的请求?
【发布时间】:2013-05-30 13:30:41
【问题描述】:

我正在开发基于 angularjs 和 rails 的单页应用程序。我使用 RABL 来渲染 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 毫秒(有一个用户请求!)(Active Record,只需 50 毫秒)。它太长了。我还没有激活缓存。根据 Github https://github.com/nesquena/rabl/issues/49 上的这个相关问题,嵌套属性会减慢渲染速度...

我的问题:如果嵌套属性的生成需要很长时间,发送不同的请求是否更好,例如: 获取 /myresource 获取 /cmets/:id/myresource 获取 /tags/:id/myresource

你的意见是什么?

【问题讨论】:

  • 答案取决于很多事情......网络与服务器相关的延迟有多少,有多少数据,您对 API 有多少控制权等等。我更喜欢分块当我可以在需要详细信息之前向用户显示某些内容时。

标签: ruby-on-rails json performance rabl


【解决方案1】:

如果生成嵌套属性需要很长时间,发送不同的请求会更好吗?

这取决于:

  • 如果客户端必须立即发出这些请求,并且速度是一个问题,那么这将取决于是否可以在处理单个请求之前处理所有这些请求。这取决于您处理请求的服务器数量以及是否可以一次(或几乎一次)处理多个请求。

  • 如果客户端不需要那些其他资源,甚至可能永远不需要它们,那么单独的请求可能会更好,但它会影响客户端的设计,所以你必须考虑到这一点考虑。

我可能还漏掉了其他一些东西,但这是初学者的两个。

还有一些事情:

  • 您能否在查询中使用 include:/.includes(...) 或 join(s) 来减少 n+1?

  • 您是否也将JBuilderActiveModel::Serializers 视为RABL 的替代品? JBuilder 是 Rails 4 的一部分,ActiveModel::Serializers 由 Rails 的一些核心团队成员开发。

  • 关注json-api 项目(也可以在github 中提供反馈)。

  • 如果您想避免大量服务控制器实现,请查看restful_json

【讨论】:

  • 我使用了包括:。最后,我决定切换到 ActiveModel::Serializers。我的响应速度从 800 毫秒提高到 350 毫秒!不幸的是,缓存系统似乎没有由 ActiveModel::Serializers 实现。所以,我会看看 JBuilder !
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多