SWFUpload 上传完毕后不能马上显示在文件列表的问题跟踪


最近的项目中遇到一个奇怪的问题, 我们的文件上传完了之后, 有一个非常大的几率不能够马上list 出来, 过5-6 S 之后重新刷新又出

来了。这里先介绍下系统的架构

               file Meta data DB
SWFUpload ==> app server box ==> File Server
               file NFS system

这里需要注意的时候app server  和File service 都是做了负载均衡, 并且在F5的loadbalance 后面的

相关功能的工作流程:
1。进入App 的File list 页面, 去list 当前folder下的最新50 个文件
2。SWFupload(flash upload) 把文件发送到app server
3. app server 做了必要的校验之后, 把文件内容发送到File server 上
4。app server 返回call File service 的文件保存操作的结果给front end的前台
5。front end call ajax to fresh File

问题排查:
1。 首先排查log, 没有看到有什么异常
2。 然后我们怀疑我们的排序代码会不会有什么问题, 仔细阅读代码, 没看到什么异常
3。 用IEhttpAnalyzer 抓包, 发现第一步的1# list 和 第五步的5# list 都被负载均衡F5 foward 到同一台app serser上, 但是第二步

上传操作发送数据到一个和1,5 所不同的App server 上。
4。 再排查发现发现我们File server 直接的的文件同步是异步的, 元数据的缓存在File server 各个server之间的同步是需要一个时间的

。 而且App server 和File server 之间是存在load balance 的session sticky的。这也正解释为什么我们上传完以后不能马上list 到的

问题出现几率不是100%;
5。 再排查的时候我们发现对F5 对浏览器和appserver 之间的session sticky的设置的策略是在cookie 里面记录一个server的id, 下一次的request, F5 根据cookie中的server ID, forward 到前面已经访问过的机器上, 而且在response 中设置这个cookie和在request 分发阶段的读取对app都是透明的。但是问题是SWFupload 有个known issue 是http://demo.swfupload.org/Documentation/#knownissues swfupload 无法读取到浏览器上其他非swupload 所产生的cookie的。 在我们这个案例里面就是第二步的upload request 的时候swfupload 无法得到第一步list 的时候F5 在resposne 的cookie上设置的server id。

解决方案:
找到问题根源, 解决方案就比较简单了, 我们在程序中自己把第一步中cookie 中的server id 读出来, 以参数的形式append 到upload 操作中的url上, 并且修改F5 策略, 分发不仅要要从cooike 中读server id, 还要从url 的参数里面读server id

你可能感兴趣的:(工作,Ajax,浏览器,Flash)