如题:前台想要显示插入 DB 数据的进度条后台事物中该如何写大家有没有遇到相同的问题,有没有好的建议?
这种的话,你如果想做的完善很麻烦,一种方法是 ActionCable 或者类似的长连接方案,后台插入数据到一定数量的时候就往前台推一下进度(其实就是已导入数量和总量)
没有 ActionCable 的话,就是做个 API,然后想办法记一下导入的状态,然后前端定期轮训
或者最粗暴的,弄个假进度嘛... 布朗运动往前走
偷懒的话直接搞个 Job 模型,记 User total_count processed_count 然后导入数据的时候,导入几条就更新下,然后前端 API 定期轮寻就好了
RPC 解决起来会很方便。
RPC 解决起来会很方便。
用 streaming 是否能解决呢? https://www.sitepoint.com/streaming-with-rails-4/ 就是一个想法,没尝试过。。。不知道对不对。
这其实是两个问题:
前端基本就是 web 接口的事情,可以用 REST API 定期轮询也可以用 Websocket 来推送。两者代码量其实差不多。
后端需要的是持久化一个 job 的 id, state, progress,至于是放在 Redis 里还是 RDBMS 也都无所谓。只要实际干活的后台任务定期更新 job 就好。我现在更倾向于 RDBMS,因为 job 这种数据往往以后还需要查询到,也有可能附加其他信息(导入时间/完成时间,关联的资源等)
之所以这么说,是因为后端的 progress 如何更新跟前端如何获取数据没有关系。比如后端通过 background job 在导入完成后更新 job progress,但给前端的接口仍然是 REST API。或者后端用 ActionCable 封装一个 Websocket 接口,但在 channel 内仍然是轮询获取最新进度。