# 《并发设计模式》第21章-承诺模式-文件同步助手项目性能太差原因分析

作者:冰河
星球: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)

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

  • 本章难度:★★☆☆☆
  • 本章重点:了解承诺模式在文件助手项目中的应用,进一步重点掌握承诺模式在实际项目场景中的应用,并能够结合自身项目实际场景思考如何将承诺模式灵活应用到自身实际项目中。

大家好,我是冰河~~

文件同步助手是一个将本地文件同步到多台服务器上的应用服务,会监听本地服务器上的一个文件目录,发现文件目录有变化,就会将变化的文件同步到远程服务器,以便进行文件的自动备份管理。在文件同步助手同步备份文件的过程中,有两个业务关联性不强的逻辑,一个是与远程服务器建立连接,一个是扫描本地目录的文件,综合来看,文件同步助手项目可以基于承诺模式实现。

# 一、故事背景

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

起初,小菜开发的还算是比较顺利,按照步骤一步步开发,提交测试也比较顺利。但是工作努力,学习积极的小菜并不会止步于此。他在想怎么更进一步的优化这个项目。正当小菜思考时,测试又发来一个报告,说文件同步项目功能测试还算可以,但是并发上来性能就比较差了。

看到这个报告后,小菜心想:果然和我想的一样,看来是真的要优化下这个项目了。

于是,小菜便开始思考如何优化文件同步助手项目,但是思考来思考去还是未能想到比较好的优化方案。

# 二、求助老王

实在是没办法了,小菜不得不再次向老王求助,于是小菜走到老王的身边说:”老大,在开发文件同步助手项目时,又碰到性能问题了,可以帮我分析下吗?“。

“好,我看看”,老王说道。

于是,老王跟着小菜来到了小菜的工位,看起了小菜写的代码。

不一会儿,老王说道:“哎呀,小菜,咱不是刚讲完承诺模式吗?你这项目里不就是可以用承诺模式来优化吗?你咋这么快就忘记了呢?”。

“额”,小菜此时有点懵逼了。

老王看着一脸不解的小菜,说道:“走,去会议室,我再给你讲讲”。

于是,老王和小菜拿着电脑再次走进了会议室。。。

# 三、分析问题

来到会议室,老王放下自己的电脑对小菜说:“我今天主要给你分析下问题所在,回头你可以尝试使用承诺模式优化下项目,如果还有问题,我到时再给你讲,尽量自己多尝试解决下问题”。

“好的”,小菜回应到。

“好,那我们开始吧”,于是老王便开始吧啦吧啦的讲起来。

对于文件同步助手来说,最核心的功能就是将本地的文件同步到其他的服务器。具体逻辑就是会指定本地服务器上的某个目录为同步的目录,文件同步助手会监听这个文件目录的变化,一旦发生变化就会将文件同步到其他服务器,以便备份相应的文件资源。

所以,在实现上,文件同步助手会有两个核心逻辑:一是与其他服务器,比如阿里云或者腾讯云建立网络连接,连接成功后,获取到阿里云或者腾讯云的同步地址,二是监听或者扫描本地服务器目录中的文件,如果我们将两个步骤串行化执行的话,就会如图21-1所示。


可以看到,如果是串行执行任务的话,就会按照先执行连接阿里云或者腾讯云的任务,任务执行完毕再执行扫描本地文件的任务,两步任务都执行完了,就会触发将本地文件上传到阿里云或者腾讯云的逻辑。

其实,在文件助手运行的过程中,连接阿里云或者腾讯云和开启监听或者扫描本地文件的操作都是比较耗时的,如果这两个逻辑比较慢,或者被卡住,则性能会非常差。在并发量不高的情况下可能也会出现这种问题,导致性能低下。如果并发量上来,那么性能就会更差了。

这里,可以再画一张图来表示,如图21-2所示。

# 查看全文

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