2亿数据怎么导出到Excel?

java突击队 2023-01-18 08:00 发表于四川

以下文章来源于的数字化之路 ,作者唐成

的数字化之路.

记录学习与思考,享受进步的小欢喜

  • 拉通业务价值

  • 导出到几个Excel?

  • 如何做:难点剖析

  • 如何做:技术方案-整体方案

  • 如何做:技术方案-详细方案

  • 如何做:技术方案-注意事项

  • 小结


人狠话不多--这个要求不简单!

有问题:

导出的需求,不符合线上数据闭环的原则,且有引发数据泄漏的风险!

做个微信那样的App需要多少钱?

导出2亿数据,对系统的要求更高,需要占用更多精锐研发资源。

查看2亿条数据的excel,用户电脑的配置低时,有卡或死机。

拉通业务价值

根因分析:

  • 导出2亿条数据,到底解决了什么业务问题?

  • 从产品矩阵的角度看,属于哪类场景的哪类问题?

  • 导2亿数据是个长期方案,还是一个临时方案?

  • 为什么一定要把数据导出来,增加一个线上功能能不能解决问题?

  • 为什么一定要导这么多,这些数据都是有必要的吗?有没有数据泄露的风险?是否符合数据分类分级的要求?

另外,一个包含2亿条数据的Excel,用户需要什么配置的电脑才能正常查看数据?

用户不知道自己想要什么。需求不是来自用户的,用户不知道自己想要什么,而是需要你来告诉他,他需要什么。

如果是一个长期方案且只有导出数据才能解决问题,或者“老板让我做的”,或者“你要尊重我的专业性,做好你自己的事情就好了”,或者“我让你做啥你就做,那有那么多事,你觉得我是工具人吗?”,那么,就进入下一步

没有银弹!是的,这个功能只能通过系统化方案和高超的Coding技艺了

导出到几个Excel?

另外Excel中一个sheet中最多有1 048 576行。导出2亿数据需要分sheet或分excel。

想了解如何查看sheet最多有多少行?见文章末尾

一个Excel中的sheet数是有限制的:excel2003限制255个;excel2007无限制。

excel2003:一个Excel中最多只能包含267386880,即2亿6千7百3拾8万6千8百8拾行。

达成共识后,进入下一步

如何做:难点剖析

这个需求的特点:导出的数据量大

难点:

  1. 耗时较长

  2. 直接从导出服务中下载Excel数据流时成功率低。服务器不稳定、请求超时、网络抖动会引发失败

  3. 导出大量数据时会引发服务器不稳定。导出过程会占用服务器内存,如果多个导出任务同时进行,很容易耗尽服务器的内存

解决办法:

  1. 异步导出

  2. 采用导出的excel上传到Oss的数据流转形式。提升导出功能的稳定性和确定性

  3. 导出任务分类分级。根据导出的数据量,对导出任务分类,然后不同的并发策略

  4. 降低导出大数据量任务的并发数

  5. Oss上的数据,要分类分级。导出的数据有时效性,属于临时数据,不需要长期保存

想了解直接从服务器端导出byte流的缺点?见文章末尾

如何做:技术方案-整体方案

异步导出的方案:

方案一: 用户触发导出后,使用异步线程执行导出任务。

方案二:将导出操作抽象成一个任务,并持久化到数据库,然后由定时任务来完成导出

方案三:将导出操作抽象成一个任务,并持久化到数据库,然后将任务Id发送到消息队列,通过消费队列中的消息来完成导出

结论:

  1. 将导出操作抽象成一个任务,并持久化到数据库【优先级高】;

  2. 根据导出的数据量将任务Id分发到不同的消息队列【优先级高】,譬如耗时的任务阻塞了小任务,提升导出任务的吞吐量

  3. 提供一个定时任务检查遗漏的任务【优先级低】。

没有采用使用异步线程进行导出的原因:

  1. 容易失败。2亿条数据导出耗时较长,如果遇到应用重启,任务就失败了

  2. 扩展性差,会引发稳定性风险。导出大量数据任务较多时,会占用大量内存,很容易出现稳定性问题。

  3. 不容易做分类分级。会出现一个耗时导出任务,导致所有导出任务都无法正常工作

如何做:技术方案-详细方案

下载中心整体设计

https://www.processon.com/view/6382e4b4e0b34d37c46db1e3

如何做:技术方案-注意事项

  1. 大数据量导出任务,获取数据时要采用小批量多次获取的策略。比如分页获取数据

  2. 可以动态调整导出任务的并发数。防止服务器资源被快速耗尽,而影响稳定性

  3. 要确认默认的ConsumeTimeout是否能满足需要。比如RocketMq每条消息消费的最大超时时间默认是15分钟,超时时间则判定消费失败,然后重新投递

  4. 选择一个好的“轮子”,可以少踩坑。比如Easy Excel

小结

  1. 耗时的任务异步化

  2. 要有IT sense。数据量不同,需要的能力就不同。比如都是聊天软件,做个微信需要多少钱?

  3. 处理海量数据时,要控制并发

  4. 要控制滞留内存的数据。非必要的数据,及时释放掉。

  5. 避免出现方案级别的瓶颈。比如一个耗时的导出任务,让整个导出功能都停摆

  6. 要分类分级。不同的场景要使用不同的策略,提供更多的处理办法

  7. 数据及时清理。比如导出的数据都有时效性,不需要长期保存在Oss,

  8. 数据安全的sense。导出的业务数据长期滞留线上,会有数据泄漏风险

  9. 不同的“轮子”都有各自特点,提前做好调研,避免踩坑。实在拿不准时,就用自己熟悉的

最后

好钢要用在刃上。
用合适的办法,最小成本解决业务问题,最好是长期性解决。

补充:

如何查看sheet最多可以放多少行的内容?

step1:新建一个Excel并打  

step2: 在空白的Excel工作表中,使用鼠标点击sheet内的任意单元格    

step3: 按快捷键CTRL和向下方向键,这时,会跳转到这个工作表的最后一行  

Windows:CTRL和向下方向键;

Mac:COMMNAD和向下方向键

1048576

Command-向下箭头键

参考:

直接从服务器端导出byte流的缺点:踩了坑:导出功能没做好,差点被投诉

https://www.kdocs.cn/l/scKhZ8COYJpW

https://www.cnblogs.com/softidea/p/15314592.html

https://easyexcel.opensource.alibaba.com

https://mp.weixin.qq.com/s/mEsu7QnkDjf13Xb3Ztcb6A

java突击队

技术经验分享

公众号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值