Web services 如何向负载平衡的HTTP Web服务添加持久连接支持

Web services 如何向负载平衡的HTTP Web服务添加持久连接支持,web-services,keep-alive,haproxy,persistent-connection,Web Services,Keep Alive,Haproxy,Persistent Connection,我们正在使用haproxy实现HTTP Web服务负载平衡。Web服务是通过SSL访问的。它是一个RESTful HTTP服务,只接受JSON,做一些工作,然后返回JSON。没有会话的概念 我们在一对冗余webservice服务器前面设置了冗余负载平衡器。每台服务器都位于Apache的后面,Apache被用作代理以处理SSL和日志记录。如果重要的话,我们的Web服务是一个Clojure(java)应用程序,使用compojure(jetty)处理HTTP 这是一个简图,显示了客户机请求通过现有系

我们正在使用haproxy实现HTTP Web服务负载平衡。Web服务是通过SSL访问的。它是一个RESTful HTTP服务,只接受JSON,做一些工作,然后返回JSON。没有会话的概念

我们在一对冗余webservice服务器前面设置了冗余负载平衡器。每台服务器都位于Apache的后面,Apache被用作代理以处理SSL和日志记录。如果重要的话,我们的Web服务是一个Clojure(java)应用程序,使用compojure(jetty)处理HTTP

这是一个简图,显示了客户机请求通过现有系统的路径

client request->haproxy(负载平衡)->apache(ssl,日志)->webservice

我们希望到负载平衡器的任何连接都建立一个持久连接,然后由同一服务器为通过该持久连接发送的所有后续请求提供服务。换句话说,我们不希望与haproxy的持久连接向多个webservice服务器发出请求


你会建议我们如何让它工作?我们如何将负载平衡器的给定连接“固定”到特定的webservice服务器?我们如何防止意外加载具有多个密集请求的特定webservice服务器?

在我们的HAProxy配置中,我们使用
cookie
选项在后端级别执行此操作。这是因为他有许多网站,其中一些我们确实想要持久性,而另一些我们不想要

在我们所做的工作中,后端在
haproxy.cfg
中如下所示:

backend examplesite
cookie STK insert indirect nocache maxidle 30m maxlife 8h
server server1 192.168.0.1:80 cookie n1
server server2 192.168.0.2:80 cookie n2
这将在第一次请求时设置名为
STK
的cookie。Haproxy将自动为此cookie分配一个值,然后使用该值向同一节点发送后续请求

我们还决定添加
n1
n2
cookie前缀。。。这意味着如果请求要发送到节点1,cookie值将以
n1
作为前缀,如果请求要发送到节点2,cookie值将以
n2
作为前缀。这在调试时非常有用


无论哪种方式,我都建议您看看周围的
cookie
选项

您可能还需要查看
appsession
选项。这允许HAProxy将现有cookie(如ASPNetSessionId或PHPSESSIONID)用于相同目的


我以前在这方面有问题,但最近有一个服务器故障问题的答案,应该可以解决这个问题。您可以在请求中使用一个额外的cookie来尝试它

默认值
块中使用
平衡源代码
,同时删除
选项httpclose
条目,就达到了这个效果。

谢谢。我们正在运行一个HTTP Web服务,它接受并返回JSON。连接到Web服务的客户端不是浏览器,所以我怀疑cookie在这种情况下是否有用。