# 《并发设计模式》第20章-承诺模式-基于承诺模式优化社区电商项目

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:了解承诺模式,重点掌握承诺模式的核心原理与执行流程,掌握承诺模式的异常捕获机制、轮询机制,以及承诺模式在实际项目场景中的应用,并能够结合自身项目实际场景思考如何将承诺模式灵活应用到自身实际项目中。

大家好,我是冰河~~

承诺模式本质上还是多个线程并行执行项目, 当项目中存在多个关联性不强的业务,哪怕多个关联性不强的业务之间存在一定的关联性,比如业务A和业务B,业务A虽然和业务B在主体逻辑的执行上关联性不大,但是业务A的执行需要业务B的执行结果,此时,都可以使用承诺模式实现。

# 一、故事背景

小菜在开发社区电商系统的用户下单、支付、发送积分和优惠券业务时,尽管在功能开发方面比较顺利,但是程序执行的总体性能比较差。老王为小菜以模拟案例的形式讲解了程序性能低下的原因,但是小菜靠自己还是没有解决相关的问题,好不容易找到老王分析问题的原因和解决方案,刚将什么是承诺模式讲清楚后,就被产品经理打断了。

小菜心里还是很不爽的,尽管心里不爽,但是也不能表现出来,他也只好先把到底什么是承诺模式认真复习一遍,自己尝试根据目前学到的承诺模式的相关知识去优化社区电商项目。可事情总是那么事与愿违,明明听懂了,为啥自己动手开发的时候还是无从下手呢。。。

# 二、寻求帮助

明明听懂了,奈何自己功力不强,还是无从下手,要不是产品经理打断,现在已经通过承诺模式优化好社区电商项目了,小菜心里这样想着。可想归想,问题还是要解决。所以,这天他仍旧是最早一个来公司的,不为别的,就等老王到公司后,让老王讲讲到底该如何基于承诺模式优化下社区电商项目。

此时,老王来到了公司,看到小菜已经来到公司,便说道:”小菜,早啊,社区电商项目优化的如何了?“。

小菜一听是老王的声音,赶紧回过头,站起身对老王说:“昨天是听懂了,下班回到家也认真复习和总结了,但还是不能自己基于承诺模式优化项目,老大可以再继续给我讲讲吗?”,小菜不好意思的挠着头说。

“可以,今天我就给你基于之前写的模拟案例,给你讲讲如何基于承诺模式优化社区电商项目”。

“好的”。

“这样,我们还是去会议室说吧”。

“好的”。

于是,小菜跟着老王一起走进了会议室。。。

# 三、问题分析

“昨天我们已经分析了你写的代码性能低下的原因,今天,我们再看复习下,还是看昨天画的两张图来对比下”,老王说道,于是,便开始吧啦吧啦的讲起来。

在执行模拟案例程序时,之所以程序执行的性能太差,从业务角度来看是串行执行了发送积分和发送优惠券两个关联性不强的业务,此时的执行流程如图20-1所示。


可以看到,尽管为用户发送积分和发送优惠劵的逻辑可以并行执行,但是在之前的模拟案例中是按照串行的方式执行的,执行完发送积分的逻辑才能执行发送优惠券的逻辑。此时,如果发送积分要耗时10秒,发送优惠券要耗时5秒,那执行完发送积分和发送优惠券的逻辑就要耗时15秒才能完成。

如果将发送积分和发送优惠券并行执行的话,执行流程如图20-2所示。


可以看到,当发送积分和发送优惠券并行执行时,如果发送积分要耗时10秒,发送优惠券要耗时5秒,那执行完发送积分和发送优惠券的逻辑总体耗时取决于耗时最多的业务逻辑,也就是只需要10秒钟就能够完成。这样,一方面提升了程序执行的性能,另一方面也提升了程序执行的并发度。

那使用承诺模式要如何实现程序的并行执行呢?其实就是可以先开始一个任务的执行,并且得到一个用于获取这个任务执行结果的凭据对象,不用等到这个任务执行完毕再去执行其他的业务逻辑,如果需要获取执行任务的结果,可以调用凭据对象的相关方法来获取结果数据。

“那我们接下来就基于承诺模式优化案例代码”,老王继续说道。

“好的,小菜回应到”。

# 四、优化代码

# 查看全文

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码