难点一:前端的搜索条件或结果如何传递到后端队列中,如果传递条件,条件查询可能会依赖前端的其他函数或库,处理队列的任务需要重复包含许多逻辑,很不优雅;直接传递结果对象太多体积太大,料想必然会很占资源。最终结局方案是传递 SQL 语句。队列任务直接运行SQL进行查询,省掉许多中间过程。
难点二:后端执行任务以后,如何通知到前端去下载文件。这里有几种方案:1)使用email离线通知;2)使用 websocket 推送;3)前端轮询。1 操作繁琐更适合超大量数据(耗时N分钟以上)导出,2 架构复杂有高射炮打蚊子的感觉,而且websocket可能不是太稳定,最终选择 3,客户端用 HEAD每隔一秒去fetch文件状态,一旦文件存在(返回200)则渲染一个下载链接,用户使用 GET方法点击下载