用户从我的应用程序向第三方API发出请求,其限制为3 req / min。例如,当用户是一个没问题的时候从控制器那里做。我想排队所有用户请求并以适当的时间间隔发送它们。我不想以异步方式执行此操作,但希望向用户显示进度条或微调器。我试图用Sidekiq gem做到这一点,但这是在完成作业后渲染结果的问题(我的app控制器尝试在创建之前从DB获取记录)。如果是标准的方式吗?
控制器
InitWorker.perform_async(current_user.id, params[:group][:domain], params[:group][:owner_id])
@group = Group.find_by_domain(params[:group][:domain]) || Group.find_by_owner_id(params[:group][:owner_id])
工人
here we creates a group
所有这些都会从带有remote: true
的表单中获取数据,并通过js
呈现新组。如果没有工作人员,它就可以完美地工作。但是使用上面的代码,它会在数据库中创建记录,但不会呈现任何内容,因为无法找到@group
个对象。
更新
我发现gem sidekiq-status
可能会对我有所帮助,但现在无法理解,如何从工人那里获取数据。也许有人有经验?
控制器
job_id = InitWorker.perform_async(current_user.id, params[:group][:domain], params[:group][:owner_id])
data = Sidekiq::Status::get_all job_id
data # at this point I can see value stored in worker (with debuger) Hash here has 10 elements
Sidekiq::Status::get job_id, :g_sys_id # but here hash has only 5 elements, and value that I need is absent.
Sidekiq::Status::at job_id #=> 5
Sidekiq::Status::total job_id #=> 100
Sidekiq::Status::message job_id #=> "Almost done"
Sidekiq::Status::pct_complete job_id #=> 5
有人请解释如何使用它!
答案 0 :(得分:0)
您必须异步执行此操作。否则,您将阻止其他用户的申请。因此,您必须实现某种发布/订阅机制,用户将其请求发送到队列并订阅一些异步消息通道,该通道会发出有关任务完成情况的通知。
在rails 5中,ActionCable将采用标准方式。它已经在掌握了,所以你可以尝试使用github的最新rails版本。对于rails 4,您可以使用faye