Рендеринг JSON: вложенные атрибуты или разные запросы?

Я работаю над одностраничным приложением на основе 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, вложенный атрибут может замедлить рендеринг...

Мой вопрос: если генерация вложенных атрибутов занимает много времени, лучше ли отправлять разные запросы, например: get /myresource get /comments/:id/myresource get /tags/:id/myresource

Каково твое мнение ?


person vpoulain    schedule 30.05.2013    source источник
comment
Ответ будет зависеть от очень многих вещей... насколько задержка связана с сетью и сервером, сколько данных существует, насколько вы контролируете API и т. д. Я предпочитаю фрагментацию, когда я могу отобразить что-то пользователю прежде чем нужны подробности.   -  person Sharondio    schedule 30.05.2013


Ответы (1)


Если генерация вложенных атрибутов занимает много времени, лучше ли отправлять разные запросы?

Это зависит:

  • Если клиенту нужно будет сделать эти запросы сразу, а скорость является проблемой, то это будет зависеть от того, могут ли все эти запросы быть обработаны до того, как будет обработан один запрос. Это будет зависеть от количества серверов, которые у вас обрабатывают запросы, и от того, можно ли обрабатывать несколько запросов одновременно (или почти одновременно).

  • Если клиент не нуждается в этих других ресурсах сразу и может даже не нуждаться в них когда-либо, тогда отдельные запросы, вероятно, были бы лучше, но это повлияет на дизайн клиента, поэтому вы должны принять это во внимание.

Есть, вероятно, и другие вещи, которые я пропустил, но это два для начала.

Еще кое-что:

  • Можете ли вы использовать include:/.includes(...) или соединения в своем запросе, чтобы уменьшить n+1?

  • Вы также смотрели JBuilder и ActiveModel::Serializers в качестве альтернативы RABL? JBuilder является частью Rails 4, а над ActiveModel::Serializers работают некоторые члены основной команды Rails.

  • Следите за проектом json-api (также в github, где вы можете оставить отзыв).

  • Взгляните на restful_json, если вы хотите избежать большого количества реализации контроллера служб.

person Gary S. Weaver    schedule 30.05.2013
comment
Я использовал включить:. Наконец, я решил переключиться на ActiveModel::Serializers. Мои ответы ускоряются с 800 мс до 350 мс! К сожалению, система кэширования не реализована в ActiveModel::Serializers. Итак, я бы взглянул на JBuilder! - person vpoulain; 31.05.2013