【问题标题】:Optimising Rails dynamic JSON CPU/memory intensive operations (caching?)优化 Rails 动态 JSON CPU/内存密集型操作(缓存?)
【发布时间】:2014-05-12 22:28:43
【问题描述】:

我们构建了一个包含 Angular 前端和 RoR 后端的动态问卷。因为有很多动态部分需要处理,所以不可能使用 ActionView 或 jbuilder 缓存助手。对于每个 Questionnaire 请求,都有相当多的查询要做,例如检查答案的有效性、检查依赖关系等。有没有推荐的策略来缓存动态 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 响应?

【问题讨论】:

    标签: ruby-on-rails json caching activerecord memory-management


    【解决方案1】:

    没有关于如何存储和检索数据的详细信息,这有点困难。但听起来你说的是你的next_item 方法是CPU 和内存密集型来尝试找到下一个项目。那是对的吗?假设您可能想查看Linked List。每个节点(多态)都有一个到下一个节点的链接。如果您需要前进和后退,您可以将其实现为双向链表。

    【讨论】:

    • 感谢您的评论!确实有一些 CPU 和内存密集型操作。结果存储在 Postgres 数据库中。我真的应该在这个过程的早期就知道链接列表,该应用程序目前正在生产中。现在最好的方法是仍然实现链接列表而不是缓存吗?
    • 很难说,真的。但我可能会考虑运行第二个应用程序服务器,该服务器预先计算结果/数据,然后将其缓存。那可能是你最好的选择。但是,在不了解您的应用的情况下,很难提出好的建议。
    【解决方案2】:

    数据多久更改一次?如果你可以缓存它的大部分,你会发现一个触发器属性(例如updated_at),你可以在视图中进行片段缓存。甚至更好的是控制器中的 HTTP 缓存。您可以将两者混合使用。

    这有点复杂。请看http://www.xyzpub.com/en/ruby-on-rails/4.0/caching.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2019-08-28
      相关资源
      最近更新 更多