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

时间 2018/6/8 9:55:40 加载中...

说一下在项目中碰到的文件上传问题

先说一下项目的部署结构,如下图

结构图.png

我们有4台Web服务器(其实是8台,为了简化图,绘制了4台),一个文件服务器(HFS服务器),一个数据库服务器(MySQL服务器)

每台Web服务器上还有一个 FileService服务,以Windows服务的形式在运行,此服务暴漏了一个文件处理接口 ProcessFile?id=123 (id为记录id)


用户上传文件的大体流程:

用户在一个有文件上传的页面,需要填写“省份”信息,并选择要上传的文件。之后点击保存即可。类似如下:

fileupload.png

当选择文件时,会先将文件上传到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



扫码分享
版权说明
作者:SQBER
文章来源:http://blog.sqber.com/articles/load-balance-file-upload-issue.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。