我正在设计一个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。不确定你需要什么模型是否重要,但本质上这就是应该发生的事情。
- 在控制器中,创建一个
Request
对象,该对象包含要查询此第三方服务的查询参数。然后将要由Sidekiq/Resque处理的作业排入队列,让我们调用这个ThirdPartyRequest
,并将刚刚创建的Request
对象的id作为参数传入。然后在此处渲染显示Request
对象的视图。假设Request#response
仍然是空的,因为它还没有被处理,所以让用户知道它仍在处理 -
然后由一名工人处理您的工作
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
-
用户可以不断刷新他的页面以检查他/她的
Request
对象。一旦更新了响应,他们就会知道它已经完成了。如果您希望页面自动刷新,请查看faye/juggernaut/private_pub或类似Pusher的SaaS解决方案。