Rails 前台想要显示插入 DB 数据的进度条后台事物中该如何写大家有没有遇到相同的问题,有没有好的建议?

Jao · 2018年01月09日 · 最后由 jasl 回复于 2018年02月10日 · 1891 次阅读

如题:前台想要显示插入 DB 数据的进度条后台事物中该如何写大家有没有遇到相同的问题,有没有好的建议?

这种的话,你如果想做的完善很麻烦,一种方法是 ActionCable 或者类似的长连接方案,后台插入数据到一定数量的时候就往前台推一下进度(其实就是已导入数量和总量)

没有 ActionCable 的话,就是做个 API,然后想办法记一下导入的状态,然后前端定期轮训

或者最粗暴的,弄个假进度嘛... 布朗运动往前走

jasl 回复

谢谢回答,布朗运动估计搞不了,要求下次点开还得显示上次未完的进度

Jao 回复

偷懒的话直接搞个 Job 模型,记 User total_count processed_count 然后导入数据的时候,导入几条就更新下,然后前端 API 定期轮寻就好了

jasl 回复

tks 就想偷个懒 目前是设计的记在 redis 中 User total_count processed_count 导入几条就更新下

RPC 解决起来会很方便。

RPC 解决起来会很方便。

用 streaming 是否能解决呢? https://www.sitepoint.com/streaming-with-rails-4/ 就是一个想法,没尝试过。。。不知道对不对。

adamshen 回复

这个放在 transaction 中 ProgressJob Table 能记录到吗?

yfractal 回复

这个好像可以 前台轮询查吗?还得具体看看

这其实是两个问题:

  1. 前端如何去查询进度
  2. 后端如何更新进度

前端基本就是 web 接口的事情,可以用 REST API 定期轮询也可以用 Websocket 来推送。两者代码量其实差不多。

后端需要的是持久化一个 job 的 id, state, progress,至于是放在 Redis 里还是 RDBMS 也都无所谓。只要实际干活的后台任务定期更新 job 就好。我现在更倾向于 RDBMS,因为 job 这种数据往往以后还需要查询到,也有可能附加其他信息(导入时间/完成时间,关联的资源等)

之所以这么说,是因为后端的 progress 如何更新跟前端如何获取数据没有关系。比如后端通过 background job 在导入完成后更新 job progress,但给前端的接口仍然是 REST API。或者后端用 ActionCable 封装一个 Websocket 接口,但在 channel 内仍然是轮询获取最新进度。

发现了个好东西,可以简化进度追踪部分 https://github.com/sirupsen/progressrus

当然前后端通信还是要自己搞啦

需要 登录 后方可回复, 如果你还没有账号请 注册新账号