Ruby on rails Rails应用程序设计:排队、重新排队、后台服务和Redis
我正在设计一个Rails应用程序,它接收请求,使用请求中的数据调用第三方web服务,处理回复,然后向原始请求者发送响应,并向另一个服务发出PUT请求 我正试图思考如何设计这个Rails应用程序,因为它不同于规范的Rails结构 对象是列表和任务。每个列表都有许多任务,每个任务都属于一个列表 我会收到如下请求: 在本例中,我请求从2012年12月2日到2012年14月2日的任务,在列表#1中具有高优先级 然后我会发出一个第三方web服务调用,如下所示: 如您所见,对数据进行了一些处理(在本例中,id已更改) 然后通过PUT将结果发送回请求者和另一个web服务 我的问题是,如何设置Rails应用程序来处理这些类型的行为?控制器结构如何变化?这看起来是队列的一个很好的用例,如何在队列之间分配多个并发请求 首先,我不需要数据持久性(在发送响应后可以丢弃数据),并且简化了数据结构设计。(我不认为我需要ruby对象,简单地说,表示这些对象的字典或散列会更轻,实现起来更快) 编辑 因此,我将应用程序的工作流程分解为这些组件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服务调用,如下所示: 如您所见,对数据进行了一些处理(在本例中
- 解析传入请求
- 构造第三方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体系结构中的位置是什么,它是一个模型类吗?