负载均衡下的文件上传问题


说一下在项目中碰到的文件上传问题
先说一下项目的部署结构,如下图
我们有4台Web服务器(其实是8台,为了简化图,绘制了4台),一个文件服务器(HFS服务器),一个数据库服务器(MySQL服务器)
每台Web服务器上还有一个 FileService服务,以Windows服务的形式在运行,此服务暴漏了一个文件处理接口 ProcessFile?id=123 (id为记录id)
用户上传文件的大体流程:
用户在一个有文件上传的页面,需要填写“省份”信息,并选择要上传的文件。之后点击保存即可。类似如下:
当选择文件时,会先将文件上传到web服务器,并保存在web服务器上,并返回给用户一个 filename,即保存在服务器上的名字,假如是 725E8ADF842DA0F7770C386A097BACA83.docx 。
当用户点击保存时,会将 “省份信息”和 “文件名称”一同提交给web服务器,web服务器会将收到的“省份信息”和“文件名称”
保存到 “MySQL服务器”上,并返回一个 记录id。
之后调用本地web服务器上的 FileService 接口 ProcessFile?id=123,接口根据 记录id获取文件名称,根据文件名称获取到文件路径。
并将本地的文件上传到“文件服务器(HFS服务器)”上面(通过一个文件上传接口)。上传之后,还会对文件内容进行解析并处理。
目前的问题:
用户在上传文件后,在通过 FileService 接口处理时,发现 上传HFS服务器失败,即,将本地web服务器上的文件上传到HFS服务器失败了。
并且是时有发生,偶然事件,且失败的文件,后面再传,可能就会成功。
收到问题后,首先感觉是 HFS服务器的“文件上传接口”出现了问题,但后来发现,貌似是文件找不到的原因。
即,FileService 根据记录信息上传本地文件,本地文件没有找到。
这其实是负载均衡导致的。
用户A在选择文件后,上传文件可能上传到了 web1 服务器,但当用户A 保存表单时,可能访问的是 web2 服务器,web2 服务器调用的是 web2服务器
上的 FileService 服务,而 FileService 服务在本地找文件进行上传,显然是找不到的。
解决办法:
由于负载均衡的均衡方法是在服务器提供商那里处理的,所以,这里不处理负载均衡那里。
用户在上传文件时,除了返回文件的filename外,还返回服务器的局域网内的ip地址,这样就知道了文件存在哪个服务器上。
然后在用户提交表单时,将服务器的ip地址同时传递过去,然后调用文件所在服务器的 fileService 接口,这样就能保证文件能正常上传了。
附加:
获取服务器IP地址的方法:
(C#版本)
public static string GetServerIp() { string name = System.Net.Dns.GetHostName(); System.Net.IPHostEntry me = System.Net.Dns.GetHostEntry(name); foreach (System.Net.IPAddress ip in me.AddressList) { if (ip.IsIPv6LinkLocal == false) return ip.ToString(); } return "no addresslist"; }
Microsoft Office Visio 2003 的部署图
https://pan.baidu.com/s/1zfdPF22-qiE4krRIslrA1g
*昵称:
*邮箱:
个人站点:
*想说的话: