聊一聊数据导出那些事

前言

数据导出,这可以说是一个随处可见的需求,大部分管理平台,报表系统都会有这个需求。

对于这个需求,不少系统会做限制,只能从系统导出几千或几万的数据,再多的话就要提申请,经过层层审批,到 DB 那边的团队处理。

其实走不走申请,很大程度上是取决于公司的规章制度,大部分应该还是没有特别完善的,都是做在系统里,有权限的可以导出所有数据。

说实话,老黄也一直没搞懂,为什么有些人老是想着导出几十万,几百万的数据在那里看,过滤,筛选。。。

不过有需求,终究还是要满足的,像下面这种几百 MB 的 CSV 文件,是很经常看的见的。。。

常见问题

导出大文件时,一般都会遇到 带宽内存 的问题。

带宽

如果说,供下载的文件,是放在我们的服务器上面,那么下载的时候是会占用我们的流出带宽。

这个在带宽比较小的情况下是很容易占满。

针对带宽问题,最好的办法就是不占用业务系统的带宽,这个需要引入第三方云存储,比如阿里云的 OSS,腾讯云的COS。这样提供的下载链接是云存储的链接,这样就和业务系统隔离了。

内存

在生成文件时,如果没有考虑到内存的情况,一次性把数据放到内存里面,就很容易占用大量的服务器内存。

不限制站点占用的内存,很容易影响服务器上面的其他站点。

限制了站点占用的内存,容易达到限制引发站点重启,从而影响正常的访问。

针对内存问题,就是避免一次性把数据全部都放在内存里面,可以分批处理。

下面再来看看一个具体的数据导出方案。

具体方案

这个方案会有有 5 个角色参与,用户,后台系统,中间件,导出系统和云存储。

大体如下图所示:

这里老黄把它粗略的分解成10个步骤。

1. 提交导出申请

用户想导出某些内容的时候,需要在后台系统里面提交申请。

2. 生成导出批次

后台系统接收到用户提交的申请后,给这个申请生成一个批次号,同时把导出什么内容,什么查询条件记录下来。

内容这一个可以存储查询的方法名,查询条件可以存储方法参数的 JSON 字符串。

这样在导出数据那一步时可以通过反射处理。

当然还少不了时间,人,状态这些基本信息了。

把这些信息入库,这一步就算 OK 了。

3. 发送导出批次到中间件

这一步涉及到中间件的选取问题,一般会建议选择 MQRedis

发送的内容最简单的就是一个批次号就可以了,当然想把批次的其他信息组装一起发过去也是 OK 的。

4. 提交申请成功

当批次信息成功发送到中间件后,就可以认为系统已经接收了这个申请,这个时候就可以提示用户申请成功了。

5. 读取导出批次信息

导出系统这一块其实还是有很多设计的点的。导出系统这一块最好是能独立服务器部署,避免对应用服务器产生级联影响。

导出系统要监听中间件里面的批次信息,当收到批次信息后,它就要开始干活了。这个活分两类:

一类是,如果这个导出系统是 中心枢纽,只负责 调度 的话,它的活就是分配给具体的 worker 节点去执行后续的操作,好比创建一个 k8s 的任务。

另一类是,这个导出系统就是一个 worker 节点,就是负责执行后续内容的。

如果导出任务不是很频繁的话,导出系统 === worker 节点就可以了,也不要过度设计。

6. 查询/生成/加密文件

这一步才是真正的执行导出的操作。

有了批次信息就可以知道用户要导出什么东西,根据这个就去执行查询操作,然后把查询的结果生成对应格式的文件。

因为所有的文件,后面都是要上传到云存储,安全起见的话,需要加一个密码,避免所有人下载后都能打开。

文件有可能不是只生成一个,可能会按天按月切分,所以最好把文件放进压缩包里面。

这样在云存储上面都是带密码的压缩包

7. 上传到云存储

生成好文件后,就需要把文件上传到云存储里面。这里建议有条件的要走内网去上传,不然 NAT 网关或服务器的带宽容易打满。

8. 组装下载地址

上传成功后要根据参数拼接好这个文件的下载地址。

拿到下载地址后,还需要进行有效期处理,即这个下载地址会包含着它的过期时间,什么时间之后就不能再访问了。相关云存储都提供了对应的方法,所以这一步会比较简单。

一般来说,一个文件会保留 3 ~ 7 天左右的有效期,更久的话就是一个月了。不排除有土豪公司永久保存。

设置有效期主要有几个考虑

业务上,不可避免在短时间内会有人导出相同内容,在有效期范围内可以复用这一个,避免重复生成。

资源上,云存储的价格,虽然不会特别贵,但还是要省着点,会定期清理一些不需要的历史文件

9. 回填信息

这一步其实就是把处理之后的下载地址、完成时间、批次状态等信息更新回批次信息里面

10. 查询导出申请并下载

到这一步之后,用户一般会收到站内信,告诉用户已经可以进行下载操作了,当用户点下载的时候,跳到云存储的地址,等待下载完成就可以了。

写在最后

数据导出,虽然说是一个相对不那么起眼的功能,但想做到比较好的体验,也是要花点心思弄一弄的。

这里介绍的这个方案是实际在用的了,不过只列出了比较粗的内容,还有一些细节内容就不再展开了,好比同一个用户连续导出相同的内容等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何黑掉一台根本不联网的电脑

一直以来,拿到一台电脑上的密钥,方法无非有以下三种:1、直接拿到这台电脑,然后输入木马病毒进行盗取。(此种略微LowB的方法风险在于:如果被电脑主人“捉奸在床”,愤而报警,则需要黑客…

通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

首先感谢张队geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根。 书接上回通过Dapr实现一个简单的基于.net的微服务电商系统,今天来分享一下这套电商demo的通讯部分到底是如何工作的…

windows下整合tomcat和nginx

tomcat自带的apache服务器对于并发请求的处理能力比较差,并且耗费资源很大,而nginx这方便却很强悍,以下是在windows下整合tomcat和nginx的过程。 1.准备工作 下载tomcat(http://tomcat.apache.org/download-70.cgi),下…

从飞机上看下雨是这样子,太震撼了!

不同的角度,不一样的世界!来源:环球顶尖摄影版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。数据与算法之美用数据解决不可能长按扫码关注

linux基础 linhaifeng,Linux基础之命令练习Day2(示例代码)

作业一:1) 新建用户natasha,uid为1000,gid为555,备注信息为“master”2) 修改natasha用户的家目录为/Natasha3) 查看用户信息配置文件的最后一行4) 为natasha用户设置密码“123”5) 查看用户密码配置文件的最后一行6) 将natasha用…

NET问答: 为什么 null + true = string 呢?

咨询区 Javed Akram:请问 null true 为什么是一个 string 类型的 True,代码如下:static void Main(string[] args){string b null true;Console.WriteLine(b);}谁知道这背后的原理?回答区 JaredPar:这是因为你一旦引…

华为21级程序员月薪曝光:270k封神!众网友直呼长见识……

如果一个人的薪水是每月几万,估计很多人都会认为很高,而能拿到这么高薪水的人一定是一个非常优秀人。最近,一名HR在互联网上发布了一个内容。该公司表示在招聘简历中找到华为高管的简历,简历的级别为21,月薪为27万&…

做移动互联网App,你的测试用例足够吗?

我在面试测试工程师时,经常问到的一个问题是“给出Word另存为这个功能的测试用例”。除开基本的测试用例外,考虑到各种异常情况,例如内存已满、硬盘空间不足是非常重要的。但是针对移动互联网App来说,情况还要复杂的多。一个重要原…

linux 手机 wlan信号桥,手机WLAN信号桥是什么?WLAN信号的作用和使用方法

什么是寒假必备?温暖的被窝和wifi绝对是不能少的。今天就给大家介绍一下和手机WIFI有关的WLAN信号桥的知识,让大家在寒假享受WIFI又多了一种选择。感兴趣的可以一起来看看。一、什么是WLAN信号桥?WLAN信号桥简单的来说就是手机连接一个WiFi后…

.NET 6 HotReload的试用

.net v6.0.0-preview.3的HotReload我是极喜欢的,因为之前有这样的需求——状态不丢,上下文不丢。为了验证,安装完.net 6 preview 3后,新建一个webapi项目,写了如下简单代码:using Microsoft.AspNetCore.Mvc…

如何撬动机器学习的冰山一角?

目前,人工智能的应用日渐广泛。而作为人工智能核心的机器学习,是一门多领域的交叉学科,专门研究计算机模拟或实现人类学习行为的方法,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…

linux 下运行libnids,libnids出错

2017/03/28因为246上一般用的东西都比较多了,就直接使用了这部分。但当初编译的时候也不是我弄得。今天想试一下libnids的编程。编译错误在网上查了下,说是版本不够的原因,那我也不能重新编译了,毕竟还有别人说不定用的好好的。gc…

服务治理治什么,10张图告诉你答案

凌晨四点被公司的监控告警叫醒了,告警的原因是生产环境跑批任务发生故障。即刻起床处理故障,但还是花了不少时间才解决。这次故障是一次数据校验的跑批任务,校验前面跑批任务的数据是否正确。幸运的是,之前的核心任务已经完成&…

Mapgis6.7 林相图自动注记 .

林业行业制作林相图是一件比较复杂的事。Mapgis注释和子图分别对应arcmap中的标注和符号,区文件填充颜色对应arcmap中的渲染。由于mapgis中上注释文本和子图号都只能手工一个个去上。如果能结合arcmap出图的强大功能,由arcmap负责制图,mapgis…

在linux文件共享接口,入坑Linux-day13(使用vsftpd服务传输文件、使用Samba或NFS实现文件共享)...

一、文件传输协议#ftp是一种在互联网中进行的文件传输协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接收客户端发出的相关FTP命令与参数。#FTP工作的两种模式主动…

大数据分析了50万条拼多多商品数据, 得出了这样的结论

一、缘起我在杭州有位朋友,提到有家做社交的电商很火,叫拼多多,我没有在意,直到有一天,我居然在电视上看到了它的广告,广告画面活蹦乱跳,余音绕梁,我惊呆了,想知道这是何…

CentOS 7 安装 Greenplum6 (附 dotNET Core 示例)

Mysql 在面对大数据量的时候,还是表现有些吃力,所以产品中需要扩展能支持海量数据的数据库,这里选择的数据库为 Greenplum6 ,Greenplum 底层使用的是开源数据库 PostgreSQL 。本文会介绍怎样在 CentOS 7 中安装 Greenplum6&#x…

linux系统故障实验,Linux常见系统故障排除

导读: 前言 运维人员经常会遇到各式各样的系统故障,如何根据故障特征锁定问题根源,需要的不仅仅是技巧,还有遇到故障时的思路,和对系统内部的理解,本文列出了一些常见的系统故障和处理方法,在那…

MIT正式发布编程语言Julia 1.0:Python、R、C++三合一

MIT 开发的 Julia 语言是全球热度上升最快的编程语言之一,下载量超过 200 万次,下载者包括谷歌、Facebook、FAA 和美国能源部等各个部门的开发者。近日,MIT CSAIL 实验室正式发布了 Julia 1.0,该语言期望结合 C 的速度、Matlab 的…

EFCore3.1+编写自定义的EF.Functions扩展方法

前言本文主要是讲解EF Core3.0 如何实现自定义的数据库扩展函数,虽然EF.Functions 提供了很多数据库函数,但是并不全面.比如加密解密..。这样的话 我们就需要自己扩展这些数据库函数 从而达到调用的目的.本文以达梦数据库为例(其他数据库都一样)..上篇文章推荐: EF …