EXCEL导入—设计与思考
mhr18 2024-12-03 11:31 26 浏览 0 评论
作者:京东物流 叶方伟
EXCEL导入—设计与思考
一、案例信息与设计
1.1、案例需求与背景
B2BTC同城二期有一个Excel导入的功能,单次数据量小于一千,使用频次不高。但涉及到多个字段组成唯一约束,即每条数据操作时要根据唯一性组合字段来操作,要确保数据表中的数据不违反唯一性。
每条数据涉及到多次查询其他业务RPC来校验、补充信息的诉求,即使有缓存,但也可能涉及到缓存不命中问题,即单条数据的校验和导入的时效性保障不了。
1.2、整体解决方案
以下四个方案为开发过程中依次思考的四个方案,没有绝对利弊。
1.2.1、初始构思开发方案(同步导入)
首先想到的方案为常用的同步导入,即在一台容器的一个线程中完成Excel中数据的解析、校验、导入、发送通知消息三部分流程。
问题:
1.当数据量过大时,在单台服务器上操作时对服务器造成比较大的内存压力。
2.流程比较长,每条数据涉及多次RPC查询,总体时间很长。接口TP99会比较高 + 用户体验很差。
优点:
1.可以让前端同步获取导入结果。
1.2.2、方案二(改进版)
由于方案一时效不可控制,在参考了另外一个Excel导入场景后设计了以下方案:
基于原有的方案,该方案使用了线程池来校验数据并通过MQ来异步地处理每条数据,这样基于原有的方案有一定的效率提升。
但由于当时思考不充分,开发完成之后发现和实际场景不适配,并可能有TP99超时风险,只作为记录。
问题:
1.业务可以结束完全的异步,所有的导入结果都通过。
优点:
1.可以让前端同步获取校验结果。
2.线程池和异步处理一定程度上提升了数据处理效率。
适用场景:
本方案适用于前端需要同步获取导入的结果,后端不涉及唯一性校验(有单号等唯一主键信息)的场景,可以校验数据之后进行批量插入(不用MQ来发消息异步处理数据)。
方案本身没有什么问题,问题在于方案和引用场景不是最佳适配:本次导入不要求前端能即时获取到导入的结果,因此无需在这里同步获取到结果之后再异步处理数据,可以将 excel解析 + 数据校验 + 处理消息统一均异步处理。
1.2.3、方案三(最终版)
由于业务方没有同步获取导入结果或者校验结果的任何诉求,因此这里将 excel解析 + 数据校验 + 处理消息统一均异步处理(JMQ发消息给消费者来处理这些流程),只对必要的参数进行校验。
对于数据处理,将Excel数据拆分为每条的粒度,用 线程池来进行 数据校验并处理,最终由主线程统计结果。
此外,在进行数据 查询唯一性数据 + 操作数据(增加\删除\修改) 的最小并发影响粒度加上Redis锁来保障数据表的唯一性不会被破坏。
问题:
1.所有的 excel解析 + 数据校验 + 处理消息 均在一台服务器上执行,对服务器的压力会比较大。
优点:
1.用线程池处理消息,大大缩短了消息处理的时间,减少了单个服务器压力。
2.有兜底策略,可确保数据不丢失,导入流程可以正常且按时结束,不会无上限等待。
3.除必要校验的所有流程均异步处理,接口的TP99可靠且较快。
适用场景:
1.对数据完整性要求比较的业务。
2.数据量不会太大的业务。(避免对单个容器造成较大压力)
1.2.4、方案四(理想版)
对于方案三,将所有的数据校验 + 处理的流程都给一台服务器执行,造成单台服务器压力比较大,且并发度不够高,总体流程时效性可能得不到保障。因此设想了一个较为理想的方案四场景,适用于数据量大、对数据可靠性要求不高、时效性要求高的场景。
相比方案三,方案四减少了对应的对账、兜底机制,整体的流程还是异步进行。相比于线程池,用 JMQ 发送消息给 数据校验并处理的consumer来处理消息并记录结果到Redis来跟踪导入进度。此外,在进行数据 查询唯一性数据 + 操作数据(增加\删除\修改)+ 更新Redis中最终结果 的最小并发影响粒度加上Redis锁来保障数据表的唯一性不会被破坏。
问题:
1.没有兜底策略,数据校验处理的流程中可能出现有一条消息阻塞\丢失\意外结束,导致最终没有线程统计结果并发送咚咚消息。
优点:
1.除必要校验的所有流程均异步处理,接口的TP99可靠且较快。
2.利用拆分导入数据 + 多个Consumer处理消息,大大缩短了消息处理的时间。
3.拆分数据为消息异步处理,用了JMQ的重试机制来提升了数据处理的可靠性。
适用场景:
1.本方案适用于前端无需同步获取导入的结果,后端可以完全异步处理数据的场景。
2.对数据可靠性要求不是极高的业务,可接受小概率容错。
3.对导入结果失效有一定诉求的业务。
4.数据量比较大或操作比较频繁的业务。
二、持续思考
2.1 中间件的合理使用
合理利用JMQ来解耦、拆分业务逻辑可以 减少单台服务器实例内存或CPU的压力、提高数据处理并发量,同时可以利用MQ的重试机制来尽可能保障对应业务的可用性。
同时,异步处理可能存在结果丢失的情况,在数据可靠性要求不高的场景可以合理舍弃这种小概率场景发生的问题(因为有重试还一直失败)。但在数据可靠性要求比较高的场景,需要有对应的对账机制 + 兜底机制来统计数据的处理情况。(如Excel导入,可以将解析完成的数据 和 最终导入的数据进行一个数据对账,如果有数据丢失或者无响应,发出告警,让定时任务 或 人工进行二次核验来确保数据可靠不丢失)
但中间件的过度使用使得服务过度依赖中间件的可靠性,问题追踪定位难度会进一步加大,需要结合实际业务场景综合权衡。
2.2 业务充分适配场景
在进行方案的技术设计时,不要只是照葫芦画瓢,要结合自己的业务场景、业务数据量、可靠性要求等场景充分考虑,借鉴其他方案的可用之处。
如本文档中方案二借鉴了之前的方案设计,但没有考虑自己的业务场景是不是与其适配,没有充分适配自己的实际业务,还可能引入新的问题。
没有最好的技术方案,只有适配于当前业务场景的最佳方案。
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)