您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
Pipeline流水线校验批量下单
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
Pipeline流水线校验批量下单
自猿其说Tech
2022-09-30
IP归属:未知
20360浏览
### 1 业务场景 在新版商家工作台中,用户需要频繁进行下单操作,虽然有单笔下单,但是对于部分商家而言,一天下单几百上千次也是非常麻烦的一件事情,所以用户可以通过批量下单页面进行批量下单,用户只需要按照下单模板Excel填写订单信息,就可以通过导入的方式进行批量下单,解决了用户频繁下单的烦恼,节省了客户时间。 批量下单总共分为了两步,第一步是上传Excel文件进行解析,并对数据进行预校验。导入失败的记录用户可以重新修改。第二步是下单,用户下单目前是单线程同步调用ECLP接口进行下单。 其中在第一步校验过程中需要对订单中的各种字段各种数据进行校验,例如:事业部、产品、寄件人信息、收件人信息等。所以在校验这些信息时,可以采用Pipeline流水线方式对订单信息进行校验。 以下是批量下单预校验流程图。 ![](//img1.jcloudcs.com/developer.jdcloud.com/9245626b-0d06-487d-905f-e859ec807b4220220930093034.jpg) ### 2 Pipeline流程图 ![](//img1.jcloudcs.com/developer.jdcloud.com/207f7798-67c6-495b-a9ed-832e3d245cfa20220930093223.png) 系统启动时会构建一个Pipeline流水线,流水线中包含多个Handler任务处理器,当批量下单时,会将订单提交到Pipeline流水线,订单会依次经过这些Handler进行校验,并将校验结果填充到包装类中。记录这些订单校验失败的信息。 ### 3 组件介绍 ![](//img1.jcloudcs.com/developer.jdcloud.com/0cc572d8-00a1-41af-8152-499f374d658420220930093237.png) #### 3.1 Pipeline/DefaultPipeline Pipeline是一个接口类,定义了添加处理器以及执行任务的方法。 DefaultPipeline是Pipeline的实现类,添加处理器以及执行任务的具体方法实现在这个类里面。 ![](//img1.jcloudcs.com/developer.jdcloud.com/3d9eaab6-718e-4b5c-afc7-f94b594bc13320220930093250.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/b6f0da61-f406-4ccc-a85e-27a9821b106120220930093257.png) #### 3.2 Handler/AbstractHandler Handler是一个接口类,定义了处理数据的方法。 AbstractHandler是Handler的一个抽象实现类,实现了Handler的doHandler方法,并在方法执行前后做了打印日志处理,同时记录Handler的执行时长。并在执行完该处理器后,调用下一个处理器来进行校验。 ![](//img1.jcloudcs.com/developer.jdcloud.com/e030b364-0bc3-4d2c-af65-e6f951b6052920220930093318.png) 以下为AbstractHandler的其中一个实现类,用来校验事业部编码。 ![](//img1.jcloudcs.com/developer.jdcloud.com/a83d771d-b0ad-4317-9315-3312aa81a43a20220930093416.png) #### 3.3 HandlerContext HandlerContext是处理器上下文,同时也是一个单向链表,保存着当前任务处理器以及处理器名称,同时还有下一个执行器的引用。 ![](//img1.jcloudcs.com/developer.jdcloud.com/e76f582a-e998-40aa-8cdb-5ba6b6a378bd20220930093433.png) #### 3.4 DefaultPipelineBuilder DefaultPipelineBuilder是DefaultPipeline的构建者,通过构建者模式很方便的将我们所需的Handler处理器构建成一个Pipeline流水线。 ![](//img1.jcloudcs.com/developer.jdcloud.com/aeae9f52-6ff6-4bb3-8e9c-4d381b4e1f8220220930093450.png) 以下是通过构建者构建出一个同城直达产品的Pipeline对象的配置。 ![](//img1.jcloudcs.com/developer.jdcloud.com/a65f6880-64a1-405d-b19c-a4a9f63664d120220930093503.png) ### 4 设计模式应用 #### 4.1 模板方法模式 模板方法定义了Handler处理器的基本处理流程,包括入参出参日志打印,处理耗时记录等,由具体子类实现具体的校验任务,例如DeptHandler、ProductHandler等。 在模板方法模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 详细使用方法可参考:https://www.runoob.com/design-pattern/template-pattern.html #### 4.2 建造者模式 建造者模式是用来方便的构建Pipeline流水线。DefaultPipelineBuilder就是采用构建者模式来构建Pipeline流水线的。 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 详细使用方法可参考:https://www.runoob.com/design-pattern/builder-pattern.html ### 5 多线程处理订单数据 Pipeline流水线处理任务时,如果采用单线程进行操作,那么校验订单的效率会非常低下,不能够将线程利用率最大化,所以采用多线程方式处理任务,根据提交的订单数量,将订单集合拆分为几个小集合,交给不同的线程进行校验处理,提高线程利用率,减少校验时间。 采用多线程方式校验订单最主要是要保证线程安全,所以此处采用了封装包装类的方式,即将校验订单数据以及校验结果统一封装成一个对象WaybillInfoWrapper,当处理该订单的线程发现订单有错误时,直接将错误信息赋值到这个包装类上,这样就能保证这些错误信息就是这个订单的错误信息,从而保证线程安全。 WaybillInfoWrapper对象封装如下: ![](//img1.jcloudcs.com/developer.jdcloud.com/40b58332-46bd-4d07-a411-88b5e8a5697c20220930093555.png) 多线程处理订单流程如下: ![](//img1.jcloudcs.com/developer.jdcloud.com/25e4deef-7f9d-4cad-bb50-155610bc4b7120220930093607.png) ### 6 Pipeline优势 - 可扩展性:采用Pipeline方式校验订单的好处便是提高了校验的扩展性,如果批量下单中新增了一个字段,需要在下单时进行校验,只需要新增一个Handler处理器的实现类,同时添加到Pipeline流水线中即可。 - 可维护性:采用Pipeline流水线工作方式代码逻辑清晰,简单易懂,提高了代码的可维护性。 - 高性能:Pipeline流水线采用多线程方式进行处理,提高了线程利用率,减少了校验时长,提高了批量下单的性能。 - 职责单一:符合职责单一原则,保证了一个Handler只处理一个校验任务,代码结构清晰,简洁易懂。 ### 7 总结 此方案采用Pipeline流水线方式进行处理,借鉴了Netty的流水线思想,使得代码结构严谨、逻辑清晰,同时采用多线程处理方式提高了处理效率,减少客户等待时间。代码中使用设计模式来开发,使得代码扩展性和可读性增强。不仅提升了用户体验,也使得代码维护人员更容易理解和读懂代码。 ------------ ###### 自猿其说Tech-JDL京东物流技术与数据智能部 ###### 作者:丁冬
原创文章,需联系作者,授权转载
上一篇:LUA脚本实现控单规则
下一篇:Canal Instance原理浅析
自猿其说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专业服务
扫码关注
京东云开发者公众号