我有一个通过 XMLRPC 与 XMLRPC 服务器 Web 服务进行通信的网站。(该 Web 服务是使用 xmlrpclib 以 Python 编写的。)我相信 xmlrpclib 在处理一个请求时会阻塞。
因此,如果有三个用户在您之前提出 xmlrpclib 请求,您的响应时间将会是原来的四倍。
如果我收到太多 XMLRPC 请求,导致 Web 服务陷入停滞并且响应时间变慢,我该如何处理?
如果我被 slashdotted 了,我更希望第一个用户得到良好的响应时间,其他人被告知稍后再来。我认为这比让每个人都有糟糕的响应时间要好。
我该如何创建这种行为?这叫负载平衡吗?不过,我实际上并没有进行平衡,直到我拥有多台服务器。
答案1
首先,有没有办法重新设计 XMLRPC 服务器,使其能够处理多个同时的请求?让多个 Web 会话依赖于一次只能处理一个请求的服务,这在现实世界中可能行不通。流量较低的内部公司网站可能会成功,但在现实世界中,绝对不可能。
现在,话虽如此,我认为您需要提供更多关于 Web 服务平台的信息,以便获得可以使用的答案。目前我能说的最好的是“计算 Web 服务器中未完成的 XMLRPC 请求,如果太多则失败”,但这太笼统了,毫无用处。
答案2
您可以使用以下方式限制连接速率iptables使用如下语句:
iptables -A INPUT -p tcp --dport 22 -i ! vlan28 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
如您所见,我们使用它来限制连接到我们服务器的 ssh 连接的速率 - 但是通过更改端口号或其他变量,您可以在几乎任何情况下使用它
答案3
您可以通过在 XMLPRC 服务器前面放置反向代理来解决此问题。可以将反向代理配置为仅与 XMLPRC 服务器建立一次连接,同时为公众提供不同的最大连接数,例如 10 个。
例如,后端 Apache 服务器可能将 MaxClients 设置为“1”,而前端 Nginx 反向代理可能使用 worker_processes 和 worker_connections 将连接限制设置为 10 个客户端。
因此,最多 10 个客户端可以连接到反向代理,并排队等待 XMLPRC 服务器可用(受某些超时值限制)。如果同时有超过 10 个连接,则反向代理可能无法响应。因此,您可能希望对其进行调整,以便可以排队尽可能多的连接,并负责任地处理。
细节取决于实现。我曾成功使用过 HAProxy 和 Nginx 作为反向代理,并且发现 Nginx 更易于使用。
我也同意上述反馈,即在后端一次只能处理一个请求听起来可能会有问题!