C#文件同步学习心得

      前段时间公司要求写个文件同步的服务,之前了解了一些相关资料,觉得难度也不是很大,就快速的完成了文件同步的功能,后来同事提醒我一个有关测试应用的问题,恍然大悟,有不少问题居然没有考虑进去,而且这才是这个服务最重要和最麻烦的地方,简单介绍下:

 

    先介绍下功能: 有多台服务器,其中一台做主服务器,其他都是次服务器,文件通过FTP客户端上传文件到主服务器,次服务器就会做到文件同步的效果.

 

     1.从网速考虑,之前测试i的时候是通过局域网速度自然不用说,但是那到公网就不是那么回事了,所以这方面在测试的时候一定要考虑模拟真实环境,可以找个限速软件试试,在一个就是要考虑到你文件的存储方式了,如果是存在缓存中,那么这时候就要注意了,由于网速的不稳定丢包的可能性很大,尤其是在一次性传送几十个或更多文件,我里我用的是同步传输单线程,我想多线程应该也会出现此类问题,当然我最后选用的存储方式是数据库存储,这样就解决了丢包的可能.

 

      2.从服务器网络的异常考虑,如果服务器之间网络突然断掉,就需要考虑到windows服务的恢复连接,我这里用的是socket发送数据,我的解决方法是捕捉异常,发送连接测试包,确认网络再次连通.这也就可以证明为什么要使用数据库的存储方式了.

 

     3.要考虑文件上传的方式,一般情况下向服务器上传文件都是通过FTP传输,我之前就没考虑那么周全,直接用共享方式传输,结果模拟真实环境的时候就彻底失败,后来明白,FTP的传输方式有别于共享方式,共享是一次性传输一个文件,服务器监测文件的时候,发现文件的变化是一次性的,就可直接触发同步.而FTP恰恰是按照网速的限定每秒钟多少的速度传输,网速慢的它会一点点地传输文件,因此文件被分为很多块,当地一块传输过去的时候,就已经出发的文件同步事件,这样就造成一个文件同步多次,对性能来说也是极大的挑战.当然如果采用的是定时从缓存中取文件发送数据需要考虑的.

 

     4.最后一个也是我才发现的,服务架到服务器上后没几天,就发现日志里文件更新的很多,甚至没有动过得文件都作了同步更新,百思不得其解,后来经过多方测试,发现我居然忽略了一个地方,我用的是FileSystemWatcher类来做文件目录监测的,其中有个属性 watcher.NotifyFilter   =    NotifyFilters.LastAccess     | NotifyFilters.LastWrite   |   NotifyFilters.FileName   |   NotifyFilters.DirectoryName;    NotifyFilters.LastAccess 属性是需要注意的,他是一个触发同步事件的一个条件,我的程序应用环境是同步到服务器上的文件会不断有人去做只读操作,这时候问题就出现了,这样的操作即是对文件的访问,如果用文件流的 的方式读取或其他的方式,都会触发这个同步事件,这样也就可以解释为什么日志中会有那么多无关的文件更新了.后来还发现,单单是对文件属性的查看也同样符合触发的条件,通过多次试验,发现他只对当天第一次的读取访问有效果,第二次就没有触发了,当然这个是一个简单的测试,也许会有更好的解释.

    

      希望以上会给需要完成文件同步的朋友一些帮助,

    

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值