Rails应用程序设计:Queueing、Resque、Background Services和Redis



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

我正试图了解如何设计这个Rails应用程序,因为它与规范的Rails结构不同。

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

我会得到的请求是:

http://myrailsapp.heroku.com/v1/lists?id=1&from=2012-02-12&to=2012-02-14&优先级=高

在这个例子中,我请求2012年12月2日至2012年14月2日的任务,在列表#1 中具有高优先级

然后我会发出这样的第三方网络服务呼叫:

http://thirdpartywebservice.com/v1/lists?id=4128&from=2012-02-12&to=2012-02-14&优先级=高正如你所看到的,对数据进行了一些处理(在这种情况下id被更改)

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

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

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

编辑

因此,我将应用程序的工作流程分解为以下组件

  • 分析传入请求
  • 构建第三部分web服务请求
  • 发送第三方请求
  • 使工作人员排队以处理预期响应
  • 响应到达后进行处理
  • 将解析后的结果作为响应发送回

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

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

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

编辑

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

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

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

最新更新