java - 如何用Java实现 "Round Robin"负载均衡Web服务器

标签 java sockets load-balancing serversocket

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

在这种情况下,循环意味着每个端口一个 HTTP 请求。

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

所以一个 HTTP 连接请求进入一个端口,并说这需要 3 个 HTTP 请求(例如一个网页有 2 个图像)。例如,如果此请求来自端口 1234,而我的其他 2 个线程位于其他 2 个端口上什么都不做,我将如何对其进行负载平衡?所以第一个线程获得第一个请求,第二个线程获得下一个请求,第三个线程获得第一个请求,然后再次返回。 (如果这是我对round robin的正确理解的话。)

最佳答案

你需要两件事:

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

2) 您将需要确保数据结构在线程之间是可共享的,也就是说,当一个线程开始使用端口做某事时,数据结构会收到该端口繁忙的通知,然后锁定特定端口。

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

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

因此,首先,我们将创建队列以初始化 2 个锁,并且服务器将在队列中有一个迭代器。

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

当然 - 您的设计中存在潜在的死锁:如果一个线程从未完成,服务器将卡住等待锁解锁,然后再递增到下一个端口。

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

关于java - 如何用Java实现 "Round Robin"负载均衡Web服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8218599/

相关文章:

java - 使用 JTextArea 制作剪切/替换方法

java - 如何在没有国家代码的情况下获得电话联系?

java - 如何以编程方式从工作人员处终止 Beam Dataflow 作业

load-balancing - 如何实现高可用?

node.js - 使用 Node 和 Heroku 进行负载平衡

java - 解决迭代程序的错误

android - 如何执行 "RXJava 2 queue jobs"直到值改变?

将对等方的 IPv6 地址与本地主机进行比较

javascript - Node.js OSC 模块发送 TCP

web-services - 负载均衡器粘性 session 和非常旧的网络服务