优化Rails动态JSON CPU /内存密集型操作(缓存?)

时间:2014-04-01 22:11:00

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

我们已经构建了一个带有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响应的策略?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

数据多久更改一次?如果您可以缓存其中的大部分内容,并且您将找到触发器属性(例如updated_at),则可以在视图中执行片段缓存。或者甚至更好地在控制器中进行HTTP缓存。你可以混合两者。

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