用户向控制器发起POST请求,这会导致更长的动作流,这些动作是网络绑定的,通常需要2-3秒才能完成。在此之后,用户被重定向到一个新页面以接收结果。
据我所知,Rails中同时可能连接的数量与控制器中阻塞的请求数量直接相关。因此,最好将此操作作为作业入队,并在作业完成后从那里执行重定向。
这将使得轻松地支持更多的并发连接成为可能,因为这些作业的处理可以被卸载。
在Rails中实现这一点是可能的吗?或者,如何扩展网络绑定请求以支持多个同时连接?请注意:我不希望客户端轮询,这不适合像RoR这样的现代web框架。
发布于 2021-09-21 04:22:14
轮询的另一种选择是使用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
| |注意:
在到达表单页面后应尽快建立通道的原因是,作业可能在建立过程完成之前完成(因此,客户端不会在发送作业结果消息后立即收到job message)
https://stackoverflow.com/questions/69209224
复制相似问题