您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
KA账单客户端处理工具实现方案分享
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
KA账单客户端处理工具实现方案分享
自猿其说Tech
2022-02-10
IP归属:未知
19880浏览
### 1 需求背景 KA商家需要对已出账的账单明细进行二次加工处理,如进行表格合并、字段汇总和数据加工等。结算人员目前采取手工处理Excel的方式拼凑账单,针对此类定制化、重复化的工作,迫切需要系统功能来提供解决方案。 但是各个账单处理需求的实现差异较大,由于其并非系统标准流程,无法融入现有业务系统,如果按照KA新需求改造现有系统,需要投入很多研发资源,通过大数据提取方案在实际落地过程中遇到困难。 通过分析KA账单实际诉求,设计并开发出基于C/S架构的KA账单客户端处理工具,提供客户端软件层面的账单处理功能支持,提升结算人员工作效率的同时,减少定制化KA账单需求对现有系统的改造,减少服务器资源占用,打造出可持续迭代更新的产品,使后续承接KA账单需求的成本投入大大降低。 ### 2 架构设计 #### 2.1 程序架构 ![](//img1.jcloudcs.com/developer.jdcloud.com/80000d76-ff12-4c49-9002-27f35d893b3c20220210143835.png) #### 2.2 界面原型 ![](//img1.jcloudcs.com/developer.jdcloud.com/d19ff7c0-dddf-48dd-9deb-784d1121148b20220210143847.png) ### 3 技术选型 #### 3.1 使用JavaFX构建客户端应用程序 **使用JavaFX WebView作为界面基座**,选用H5混合开发技术,相比于Fxml,可以更轻松地实现复杂的页面开发,且学习成本更低。 **使用Springboot作为IOC容器**,JSBridge实现View和Service的Native通信,使用线程将业务逻辑处理和界面渲染分离开。 **使用Exe4j作为打包工具**,集成Java应用程序到Windows操作环境里,提供一致的JVM环境配置方案,解决客户端环境配置繁琐问题。 ![](//img1.jcloudcs.com/developer.jdcloud.com/f27b6395-cab0-4211-b41c-b5bc16f9c53220220210143922.png) #### 3.2 使用SQLite提高程序处理速度 大数据量处理时经常需要进行数据分治,待处理的记录存储在外存储器上,无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到处理完整个文件的目的。提升性能的方式有提高寻址速度和提高缓存命中率。最初使用了FileCache,但仅靠文件系统目录结构建立索引,产生的磁盘碎片太多,大数据量读写时异常缓慢。后调研换为SQLite,它是轻量级的关系型数据库。符合嵌入式小型数据库系统的各方面设计要求,其带顺序访问指针的B+树,有效提高了寻址效率,VFS和PageCache,有效提高了缓存命中率。 ![](//img1.jcloudcs.com/developer.jdcloud.com/7f6011eb-68a9-4943-8aad-710d6cc3fb7420220210143946.png) #### 3.3 使用EasyExcel节省内存 POI的思路是空间换时间,即通过减少数据载入内存的次数从而节约时间,而EasyExcel的思路是时间换空间,它在磁盘中预处理、解析并生成临时文件,运用SAX模式一行一行解析,并将一行的解析结果以观察者模式通知程序处理,这样就能够以较低内存处理海量数据。 ![](//img1.jcloudcs.com/developer.jdcloud.com/b9e18e59-4315-411e-bebd-9a3361b09c6820220210144008.png) ### 4 实现技巧 #### 4.1 使用AsyncEventBus快速响应事件 Guava的异步事件总线,是一种轻量级的发布/订阅模式的应用模式实现,特别适合在一个小系统模块内部使用,解耦的同时提升了通信的简洁性。 ![](//img1.jcloudcs.com/developer.jdcloud.com/69af9995-8a47-4733-9c9d-43300b749aca20220210144041.png) 异步消息队列搭配业务线程池,构建出类似Netty的Reactor线程模型,一个线程组用于接收客户端的事件请求,一个线程组用于处理I/O相关的读写或者执行计算任务,快速响应来自界面的用户事件,也给系统任务执行增加了缓冲队列。 #### 4.2 使用JSSDK搭建Java和JavaScript沟通的桥梁 ![](//img1.jcloudcs.com/developer.jdcloud.com/e8229e85-bb52-462e-a828-1b4f2774eb5a20220210144104.png) 1. 在JavaScript调用Java时,采用了类似于微信JSSDK的技术,将封装好的JavaConnector接口注入到浏览器对象模型里,使用原生JS即可调用API接口,提供丰富且可控的客户端原生能力。 1. 在Java回调JavaScript时,参考了Electron主进程和渲染进程之间的异步通信模型,借助JSObjects对象将事件推送到自定义的EventEmitter实例,支持注册订阅和异步分发。 #### 4.3 使用自定义类加载器实现客户端自动更新 1. 在主程序启动前,启动更新程序,获取远程清单文件 1. 将远程清单文件和本地清单文件进行对比,找出并下载Hash值变更的JAR包 1. 自定义一个URLClassLoader,用于加载用户路径下的JAR包 1. 通过Thread.currentThread().getContextClassLoader()更改当前线程的线程上下文类加载器 1. 通过反射调用目标应用类的newInstance方法启动主程序 1. 主程序使用自定义ClassLoader加载到最新的目标字节码启动 ### 5 性能优化 #### 5.1 百万数据聚合计算处理时的时空权衡 **需求场景**: 有百万数据的账单明细文件,需要从中按业务单号+业务日期等列去重后,累加金额和数量字段输出到合并文件里。 **方案分析**: 针对单机客户端程序处理大数据量,并不像大数据引擎框架那样有低廉庞大的机器集群算力支撑,但是他们的MapReduce思想,以时间换空间的思路是可以借鉴的。 在某些特定情况下(磁盘性能好,磁盘缓存大,读写Block大,数据整体有序),顺序磁盘访问能够比随机内存访问还要快。针对个人电脑,CPU和磁盘性能都比较高,内存较小,所以我们采用时间换空间的策略,增加运算和I/O次数,减少内存占用,借助虚拟列使数据整体有序后,再进行分批读取汇总操作,使得随机查询可以转化为顺序I/O。 **处理流程:** ![](//img1.jcloudcs.com/developer.jdcloud.com/c798d9a5-8459-4d17-8a79-b3836802b94420220210144216.png) ### 6 总结 架构同质性,面对相似的功能集,借鉴参考多平台解决方案。 数据异构性,面对不同的数据集,制定针对性分类处理方案。 因地制宜,选择合适的技术而不是选择最好的技术,降低学习、维护和部署成本,提高开发、运行和产出效率。 ------------ ###### 自猿其说Tech-京东物流技术发展部 ###### 作者:程啸
原创文章,需联系作者,授权转载
上一篇:京东Spark基于Bloom Filter算法的Runtime Filter Join优化机制
下一篇:浅谈电子围栏的算法思想及技术实现
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号