# 《并发设计模式》第19章-承诺模式-到底什么是承诺模式
作者:冰河
星球: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的执行结果,那这个问题该如何处理呢?其实,这种问题仍然可以使用并发设计模式中的承诺模式解决。
# 一、故事背景
小菜在开发社区电商系统的用户下单、支付、发送积分和优惠券业务时,尽管在功能开发方面比较顺利,但是程序执行的总体性能比较差。老王为小菜以模拟案例的形式讲解了程序性能低下的原因,小菜也了解到自己写的程序确实存在性能问题。但是,尽管小菜知道代码性能低下的原因了,可是自己根本无法解决这个问题,改来改去还是无法很好的提升程序的性能。
此时,小菜想起了老王说的,像这种场景比较适合使用并发模式中的承诺模式,但是自己对承诺模式没有什么了解。于是,小菜觉得还是请教下老王比较好,就这样,小菜关掉了自己的电脑,准备洗漱睡觉,第二天去公司请教老王。
# 二、求助老王
第二天,小菜还是早早的来到了公司,此时,公司一个人都没有,小菜走到自己的工位上,打开电脑,继续在网上搜索关于并发模式中承诺模式相关的知识点。。。
不知过了多久,小菜听到了老王和产品经理说话的声音,于是小菜便站起身,朝老王走去。
“老大,你昨天说我遇到的代码性能低下的问题可以使用承诺模式解决,但是我在网上搜索了关于承诺模式的知识,不少都是理论知识,我没咋看懂,也不知道怎么解决我遇到的问题,你可以再给我讲讲吗?”,小菜挠着头不好意思的问到。
“可以,我先跟产品经理沟通下后面的需求,一会我叫你”,老王回应到。
“好的”。
于是,小菜又回到了自己的工位上继续看有关承诺模式相关的知识。
过了一会,老王对小菜说:“小菜,我们还是拿着电脑去会议室吧”。
“好的”。
于是,老王和小菜拿着电脑一起走进去了会议室。。。
# 三、一探究竟
“我们还是基于我昨天给我写的模拟案例分析,这样有助于你更好的理解问题和解决方案”,老王边打开电脑,边对小菜说。
“好的”,小菜回应到。
在执行模拟案例程序时,之所以程序执行的性能太差,从业务角度来看是串行执行了发送积分和发送优惠券两个关联性不强的业务,此时的执行流程如图19-1所示。
可以看到,尽管为用户发送积分和发送优惠劵的逻辑可以并行执行,但是在之前的模拟案例中是按照串行的方式执行的,执行完发送积分的逻辑才能执行发送优惠券的逻辑。此时,如果发送积分要耗时10秒,发送优惠券要耗时5秒,那执行完发送积分和发送优惠券的逻辑就要耗时15秒才能完成。
如果将发送积分和发送优惠券并行执行的话,执行流程如图19-2所示。
可以看到,当发送积分和发送优惠券并行执行时,如果发送积分要耗时10秒,发送优惠券要耗时5秒,那执行完发送积分和发送优惠券的逻辑总体耗时取决于耗时最多的业务逻辑,也就是只需要10秒钟就能够完成。这样,一方面提升了程序执行的性能,另一方面也提升了程序执行的并发度。
# 查看全文
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码