使用REST实现异步HTTP时的负载平衡问题

时间:2011-04-09 18:37:04

标签: rest asynchronous load-balancing polling

我已经阅读过关于异步HTTP和REST的内容,以及如何在POST后返回资源以启动长时间运行的任务,然后轮询该资源以获取任务的状态。 我想知道如果我有两台负载均衡的机器会发生什么,一台接收初始POST,另一台接收后续GET。第二个将不知道第一个启动的内容,除非我使用公共存储来保持任务的状态。 如果我想仅在客户端保持状态,我该如何防止这种情况?

2 个答案:

答案 0 :(得分:2)

当您执行POST以启动长时间运行的任务时,您确实应该在位置标头中返回一个URI以指向正在运行的任务。 e.g。

POST /LongTasks
=>
201 Created
Location: /RunningTask/233


GET /RunningTask/233
=> 
Content-Type: text/plain

InProgress

此时,您有一个代表正在运行的任务的资源的URL。此时负载平衡问题与任何其他问题相同。您无法在没有URI的客户端可访问的服务器上创建状态。

但是,只要可以直接访问这两个负载均衡服务器,就可以执行

POST http://example.org/LongTasks
=>
201 Created
Location: http://serverA.example.org/RunningTask/233


GET http://serverA.example.org/RunningTask/233
=> 
Content-Type: text/plain

InProgress

答案 1 :(得分:1)

您所指的通常称为客户端亲和力。基本上,您对客户端进行cookie操作,以便负载均衡器知道要向哪个养殖应用程序服务器发送请求。由于get和post将传播cookie,因此一个用户的查询将始终转到同一服务器。您可以在此处了解有关某些配置的更多信息(使用Apache作为Tomcat的反向代理):http://docs.codehaus.org/display/JETTY/Configuring+mod_proxy

也就是说,如果您没有大量的后端处理器,使用共享存储通常会更轻松。例如,对于一些机器,使用memcached作为状态信息的轻量级存储器并不是一个坏主意,而且我已成功用于会话数据和状态数据。

另请注意,使用反向代理可以解决SSL问题(由于加密,您无法使用硬件负载均衡器查看Cookie)。 RP对后端服务器进行编码/解码和代理。 Apache的mod_proxy是一个常见的选择,尽管nginx即将推出。您也可以使用基于IP的亲和力。然而,当我意识到整个非常大的城市学校系统因为他们的过滤系统而读取一个IP时,我才知道这是一个糟糕的想法:)