5

我们使用多个服务器来处理传入的 Web 请求,这些请求以循环方式进行负载平衡。我遇到了一个不知道如何解决的问题。

使用 AJAX ( qqFileUploader ),我正在上传一个文件。默认情况下,它进入/tmp文件夹,这很好。问题是当我尝试检索该文件时,该检索请求由下一个没有我上传的文件的服务器处理。如果我一遍又一遍地重复请求,它最终会到达存储文件的原始服务器(通过循环负载平衡),然后我可以打开它。显然这不是一个好的解决方案。

这里基本上是代码:http: //jsfiddle.net/Ap27Z/。为了简洁起见,我删除了一些。您将看到上传器对象调用 PHP 文件进行文件上传,然后在文件上传完成后,对脚本进行另一个 AJAX 调用以处理 .csv 文件。这是该过程在循环中迷失的地方。

我在这里阅读了一些关于将文件上传到内存的问题,似乎目前基本上不可行。我可以使用其他选项来上传文件并在同一个请求中处理它吗?

4

2 回答 2

6

此类问题的经典解决方案是在负载均衡器上使用粘性会话。这对您来说可能不是一个好的解决方案,因为它会修改您的整个设置以解决一个小问题。

我建议为每台机器添加一个子域前缀,例如上传到 www.example.com,然后为每个服务器分配一个额外的子域 www1.example.com、www2.example.com,它们总是直接传递给该服务器,而不是循环 DNS。

作为成功结果的一部分,您可以传回指向确切服务器的服务器名称,而不是负载平衡名称,然后所有引用上传数据的后续 Ajax 调用都使用该服务器特定的域名,而不是通用负载均衡域名。

我可以使用其他选项来上传文件并在同一个请求中处理它吗?

当然,为什么不呢?处理数据 POST 的代码可以做任何你想做的事情。

于 2012-07-18T14:28:33.760 回答
2

您的问题有(至少)2个解决方案:

  1. 您更改负载平衡

有几个负载平衡代理支持会话亲和性,也就是“粘性会话”。这意味着用户总是在会话中获得相同的服务器。

可以以这种方式运行的两个程序是HAProxy相关问题在 SO 上)和带有custon 模块的nginx在此处教程)。

  1. 您可能会遇到文件的位置

另一种选择是将存储文件的位置更改为所有服务器都可以通过同一位置访问的某个位置。例如,这可能是 NFS 挂载或数据库(文件存储为 BLOBS)。这样,哪个服务器处理请求并不重要,因为它们都可以访问该文件。

于 2012-07-18T14:31:39.980 回答