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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值