Rails:我可以从工作中重定向吗?



用户向控制器发起POST请求,这会导致更长的操作流,这些操作流受网络限制,通常需要2-3秒才能完成。之后,用户被重定向到一个新的页面来接收结果。

据我所知,Rails中同时可能的连接数量直接连接到控制器内阻塞的请求数量。因此,最好将此操作作为作业排队,并在作业完成后从那里进行重定向。

这将使支持更多的并发连接成为可能,因为这些任务的处理可以被卸载。

在Rails中实现这个是可能的吗?或者,如何扩展网络绑定请求以支持多个同时连接?请注意:我不想让客户端轮询,这只是不适合像RoR这样的现代web框架。

轮询的另一种选择是使用ActionCable,在客户端加载包含重请求的页面后,例如,结帐表单,您的js将自动建立具有特定通道id的action-cable通道,基于用户会话+任务名称,例如:heavy-task:123xyz

现在当用户提交繁重的任务时,验证后的控制器将委托给一个作业(通道id为heavy-task:123xyz),因此该控制器将可以自由地接受其他请求。一段时间后,工作完成,这将使用AcionCable将结果广播到频道heavy-task:123xyz

客户端一旦收到来自通道的作业消息,就会重定向到结果页。

client1 ---- get/ load page -------> server 
|   <------------------------200 controller
|                                   |
establish action-cable <---------------------> Channel
|                                   |        |
request -- post/ heavy task ------>  controller  | 
|----------enqueue job --> sidekiq---
|        |                          | 
|        |<--------------------job done
|        |
client1 <----------------------------------------- broadcast
|                                   |        X close Channel
------ redirect_to get/other -----------> another-controller
|           |

注意:

  • 通道应该在到达表单页后尽快建立的原因,这是在建立过程完成之前可能完成的作业(因此客户端不会收到作业消息)
  • 应该在发送作业结果消息后立即关闭通道,因为通道占用大量资源(内存)
  • 不确定比例,因为如果有这么多通道,性能会下降,你可以考虑任何电缆,参考

最新更新