我在后台有一个运行时间较长的任务,我究竟应该如何从我的后台任务中提取状态,或者以某种方式将任务完成情况传达给我的前端会更好?
背景:
基本上我的应用程序使用第三方服务来处理数据,所以我希望这个外部网络服务工作负载不会阻止对我网站的所有传入请求,所以我将这个调用放在后台作业中(我使用 sidekiq)。所以当这个任务完成时,我正在考虑向某个 Controller 发送一个 webhook,它会通知前端任务完成。
我该怎么做?对此有更好的解决方案吗?
更新:
我的应用托管在 heroku 上
更新二:
我对这个主题做了一些研究,我发现我可以在 heroku 上创建一个单独的应用程序来处理这个问题,找到这个例子:
https://github.com/heroku-examples/ruby-websockets-chat-demo
这个长时间运行的任务将在流量很大的网站上针对每个用户运行,这是个好主意吗?
最佳答案
我会使用 pub/sub 来实现它系统如 Faye或 Pusher .这背后的想法是,您可以将长期运行的作业的状态发布到一个 channel ,然后该 channel 的所有订阅者都会收到状态更改的通知。
例如,在您的 job runner 中,您可以通过以下方式通知 Faye 状态更改:
client = Faye::Client.new('http://localhost:9292/')
client.publish('/jobstatus', {id: jobid, status: 'in_progress'})
然后在您的前端,您可以使用 javascript 订阅该 channel :
var client = new Faye.Client('http://localhost:9292/');
client.subscribe('/jobstatus', function(message) {
alert('the status of job #' + message.jobid + ' changed to ' + message.status);
});
以这种方式使用发布/订阅系统允许您独立于主应用程序扩展实时页面事件——您可以在另一台服务器上运行 Faye。您还可以选择 Pusher 等托管(和付费)解决方案,让他们负责扩展您的基础架构。
还值得一提的是,Faye 使用 bayeaux protocol ,这意味着它将在可用的地方使用 websockets,在不可用的地方使用长轮询。
关于ruby-on-rails - rails 3 中的拉/推状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25653313/