如何用Java实现“循环”负载均衡Web服务器

时间:2011-11-21 21:12:58

标签: java sockets load-balancing serversocket

我希望在一个非常简单的HTTP Web服务器上用Java实现“Round Robin”负载平衡。

在这种情况下,Round Robin意味着每个端口有一个HTTP请求。

假设我有一个网络服务器,为3个不同的端口运行3个线程,每个线程监听该端口上的连接。 (这种方法可能是错误的。)

因此,端口上会出现HTTP连接请求,并说这需要3个HTTP请求(例如,一个包含2个图像的网页)。例如,如果此请求在端口1234上进入,而我的其他2个线程正在其他2个端口上执行任何操作,那么我将如何对此进行负载平衡?所以第一个线程获得第一个请求,第二个线程获得第一个请求,第三个线程获得第一个请求(如果这是我对循环赛的正确理解。)

1 个答案:

答案 0 :(得分:2)

你需要两件事:

1)您需要一个将在端口之间按顺序轮换的数据结构。这被称为“循环数据结构”。

2)您需要确保数据结构在线程之间是可共享的,也就是说,当一个线程开始使用端口执行某些操作时,会通知数据结构该端口正忙,然后锁定特定端口。

一个简单的方法可能是使用同步循环队列,在两个插槽的每一个中都有锁。

将每个端口的代表性锁定添加到队列后,您可以让每个线程在使用时锁定该特定端口。锁定一旦释放,工作就可以重新开始。

首先,我们将创建队列以具有2个init init,并且服务器将在队列中具有迭代器。

当请求进入时 - 线程将询问服务器端口。服务器将检查当前(第1个)插槽是否已锁定。如果是这样,它将等待---当解锁时,它将异步地给线程锁定,并增加队列中的位置。然后,线程将锁定此资源,处理请求并解锁。一旦线程完成处理,它将解锁资源。同时,如果第二个线程到来,服务器可以自由分配第二个端口,如果该端口是空闲的。

当然 - 你的设计中存在潜在的死锁:如果一个线程永远不会完成,服务器将等待锁解锁,然后再增加到下一个端口。

http://www.koders.com/java/fid13E588928D0C01917AC9C30E35D802BDBA546368.aspx?s=Queue#L23