1

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

我正在努力思考如何设计这个 Rails 应用程序,因为它与规范的 Rails 结构不同。

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

我会得到的请求是这样的:

http://myrailsapp.heroku.com/v1/lists?id=1&from=2012-02-12&to=2012-02-14&priority=high

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

然后我会发出这样的第 3 方 Web 服务调用:

http://thirdpartywebservice.com/v1/lists?id=4128&from=2012-02-12&to=2012-02-14&priority=high 如您所见,对数据进行了一些处理(在这种情况下,id 已更改)

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

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

一方面我不需要数据持久性(数据可以在响应发出后丢弃),并且数据结构设计也得到了简化。(我认为我不需要 ruby​​ 对象,只是表示这些对象的字典或哈希值会更轻,实现起来也更快)

编辑

所以我将应用程序的工作流程分解为这些组件

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

哪个标准 ruby​​ 控制器处理这些步骤中的每一个?除了 Lists 和 Tasks 还需要哪些模型?

4

1 回答 1

2

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

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

编辑

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

  1. 在您的控制器中,创建一个Request对象,其中包含您要用来查询此第 3 方服务的查询参数。然后将要由 Sidekiq/Resque 处理的作业排入队列,让我们调用它ThirdPartyRequest并传入您刚刚创建的对象的 idRequest作为参数。然后在此处渲染一个显示该Request对象的视图。假设它Request#response仍然是空的,因为它还没有被处理,所以让用户知道它还在处理中。
  2. 然后一个工人处理你的工作ThirdPartyRequestThirdPartyRequest然后应该获取Request对象并获取联系第三方服务所需的查询参数。它这样做然后得到一个请求。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 解决方案。

于 2012-08-22T00:52:59.390 回答