gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:43:46 25 4
gpt4 key购买 nike

我希望在一个非常简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com