Ruby on rails Rails应用程序设计:排队、重新排队、后台服务和Redis

Ruby on rails Rails应用程序设计:排队、重新排队、后台服务和Redis,ruby-on-rails,ruby-on-rails-3,resque,Ruby On Rails,Ruby On Rails 3,Resque,我正在设计一个Rails应用程序,它接收请求,使用请求中的数据调用第三方web服务,处理回复,然后向原始请求者发送响应,并向另一个服务发出PUT请求 我正试图思考如何设计这个Rails应用程序,因为它不同于规范的Rails结构 对象是列表和任务。每个列表都有许多任务,每个任务都属于一个列表 我会收到如下请求: 在本例中,我请求从2012年12月2日到2012年14月2日的任务,在列表#1中具有高优先级 然后我会发出一个第三方web服务调用,如下所示: 如您所见,对数据进行了一些处理(在本例中

我正在设计一个Rails应用程序,它接收请求,使用请求中的数据调用第三方web服务,处理回复,然后向原始请求者发送响应,并向另一个服务发出PUT请求

我正试图思考如何设计这个Rails应用程序,因为它不同于规范的Rails结构

对象是列表和任务。每个列表都有许多任务,每个任务都属于一个列表

我会收到如下请求:

在本例中,我请求从2012年12月2日到2012年14月2日的任务,在列表#1中具有高优先级

然后我会发出一个第三方web服务调用,如下所示:

如您所见,对数据进行了一些处理(在本例中,id已更改)

然后通过PUT将结果发送回请求者和另一个web服务

我的问题是,如何设置Rails应用程序来处理这些类型的行为?控制器结构如何变化?这看起来是队列的一个很好的用例,如何在队列之间分配多个并发请求

首先,我不需要数据持久性(在发送响应后可以丢弃数据),并且简化了数据结构设计。(我不认为我需要ruby对象,简单地说,表示这些对象的字典或散列会更轻,实现起来更快)

编辑 因此,我将应用程序的工作流程分解为这些组件

  • 解析传入请求
  • 构造第三方web服务请求
  • 发送第三方请求
  • 使工作进程排队以处理预期的响应
  • 在响应到达后处理它
  • 将解析结果作为响应发送回

哪个标准ruby控制器处理这些步骤?除了列表和任务之外,还需要哪些模型?

您仍然应该使用数据库,因为将数据传递给Resque是一件混乱的事情。相反,您应该将其存储在数据库中,然后将id传递给工作人员、获取数据、提交任何新数据或删除记录。这真的取决于你,但这种方法更干净。您还可以使用faye之类的推送服务,让用户知道处理何时完成

如果您希望有许多并发请求,我建议您使用Sidekiq,因为它不太占用内存。拥有4-5名resque工作人员已经可以占用大约512MB的内存。控制器结构不应改变。请评论任何你需要澄清的问题,我很乐意更新我的答案

编辑

您可能希望使用单独的数据库存储,例如Postgres。不确定你需要什么模型是否重要,但本质上这就是应该发生的事情

  • 在控制器中,创建一个
    请求
    对象,该对象包含要查询此第三方服务的查询参数。然后将要由Sidekiq/Resque处理的作业排队,让我们调用此
    ThirdPartyRequest
    ,并将刚才创建的
    请求
    对象的id作为参数传递。然后在此处呈现一个视图,显示
    请求
    对象。假设
    Request#response
    仍然是空的,因为它还没有被处理,所以让用户知道它还在处理
  • 然后,一名工人处理您的作业
    ThirdPartyRequest
    ThirdPartyRequest
    然后应获取
    Request
    对象,并获取联系第三方服务所需的查询参数。它这样做,然后得到一个请求。使用此请求更新
    请求
    对象,然后保存它

    class ThirdPartyRequest
      def self.perform(request_id)
        request = Request.find(request_id)
    
        # contact third party service
    
        request.response = ...
        request.save
      end
    end
    
  • 用户可以不断刷新页面以检查他/她的
    请求
    对象。一旦它被更新为响应,他们就会知道它已经完成。如果您希望页面自动刷新,请查看faye/juggernaut/private_pub或类似Pusher的SaaS解决方案


  • 我需要将对象存储在支持resque(redis)的同一数据存储中,还是需要单独的存储?单独的商店也可以是redis吗?如果是这样的话,我该如何使用redis作为主要的持久性机制,而不是SQL db?谢谢你的建议,btw肯定会研究sidekiq:)做了一些编辑,并提出了一些关于控制器/数据模型结构的问题。另外几个问题,这个应用程序将服务于另一个Rails应用程序(可能通过活动资源),不是浏览器,所以我只需要提供一个JSON响应。这会改变什么吗?而且,这不会在处理请求时锁定应用程序吗?我不需要使用em-http-request-gem(和eventmachine)来构造我的请求吗?还有一个问题,第三方请求类,它在Rails体系结构中的位置是什么,它是一个模型类吗?