# 《并发设计模式》第22章-承诺模式-基于承诺模式优化文件同步助手项目

作者:冰河
星球: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的执行结果,此时,都可以使用承诺模式实现。

# 一、用户故事

小菜在开发文件同步助手项目时,毫无疑问又遇到性能问题了。虽说老王给小菜讲清楚了承诺模式及其使用场景,也基于承诺模式优化了社区电商项目,但是小菜本质上还是没彻底掌握承诺模式在实际项目中的应用。这不,就在开发文件同步助手项目时,又遇到性能问题了。在老王的耐心讲解下,小菜明白了文件助手项目性能很差的主要原因,也知晓了可以使用承诺模式来优化文件同步助手项目。

但是,说归说,真正要优化的时候,小菜却又无从下手了,到底该怎么优化,此时的小菜还是挺懵的,尽管对比了社区电商基于承诺模式优化的代码,可还是有点力不从心,眼看就要下班了,小菜觉得干脆还是问老王算了。

# 二、求助老王

小菜走到老王身边说:“老大,我现在知道要使用承诺模式优化文件同步助手项目,但是还是不知道具体怎么去优化,可以给我讲讲吗?”。

老王抬头看了小菜一眼,说道:“嗯,看来你还是没彻底掌握承诺模式在实际项目中的应用啊,这样吧,我结合文件助手项目再给你讲讲吧”。

“好的,谢谢老大”。

“我们还是去会议室吧”。

“好的”。

于是,二人拿着电脑再次走进了会议室。

# 三、问题重现

“在正式讲如何使用承诺模式优化文件同步助手项目之前,我们再来明确下文件助手的需求”,老王说到。

文件同步助手的需求主要是:将服务器上存储的图片同步到云端,比如将本地服务器上存储的图片同步到阿里云或者腾讯云。具体的逻辑就是:文件同步助手项目会监听本地服务器的目录,一旦目录中发生变化,就会将变化的文件同步到阿里云或者腾讯云,在监听的过程中,为了避免同步的文件有误,还会启动扫描任务,定时扫描本地目录的文件,对比变化的文件,将文件同步到阿里云或者腾讯云。

在业务逻辑上可以将文件助手总体划分成三部分:与远程服务器建立连接、监听或扫描本地文件、同步文件到远程服务器。在小菜实现的代码中,这三部分是串行执行的,每一部分的执行都是比较耗时的,同步文件到远程服务器的任务需要等到与远程服务器建立连接的任务和扫描本地文件的任务执行完毕后再执行,如图22-1所示。


可以看到,如果连接远程服务器的任务和监听或者扫描本地文件的任务执行非常慢,在这种串行执行任务的模式下,要经过较长的时间才能开始同步文件到远程服务器,性能是非常差的。

“这个我们之前已经分析过了,这里确认可以听懂吧?”,老王问小菜。

“可以听懂”,小菜回应到。

“好,那我们继续吧”。

# 四、优化策略

既然串行执行文件助手的三部分业务逻辑性能很差,那我们可以想办法将其并行化。这里,我们可以分析下,对于与远程服务器建立连接、监听或扫描本地文件、同步文件到远程服务器,这三部分业务逻辑来说,与远程服务器建立连接和监听或扫描本地文件执行完毕后,才能开始同步远程服务器,并且在业务逻辑上,与远程服务器建立连接和监听或扫描本地文件关联并不大,这两部分可以实现并行执行,整体如图22-2所示。

# 查看全文

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