我准备利用 ajax 从前台发送一个请求到 rails server,然后 rails 接受到这个请求之后一直进行处理,直到发现自己的数据发生改变后才向前台发送回应。但是如果一直在 action 处理的话,就会发生阻塞的问题,有没有办法不让服务器发生阻塞的方法?
可以使用 ActionCable + Fork 一个新进程解决耗时操作问题。
class ExambleController < ApplicationController
def create
Process.fork do
Foo.loop(1000000) do |bar|
ActionCable.server.broadcast(channel_id , {bar: bar})
sleep 0.1
end
end
end
end
为什么非要这么设计呢?这样设计交互的需求是什么?actioncable 的方式本质上是走 websocket 嘛,让服务器端来负责 Push。actioncable 不行,那就 faye 之类的。
那分开两个接口,一个创建任务的接口,另一个查询任务状态的接口。创建任务的接口把任务放到任务队列去做;查询任务的接口检查任务状态,Ajax 轮询任务状态接口。两个接口都是立即返回。
http 长连,ror 并发应该上不来。可以考虑一单独启动一个新版 rails 服务做长连。旧服务只负责写。这要把 actioncable 写相关的代码引进来、然后两个服务连一个 redis 就行。