Я делаю дорожный балансировщик l4.
Я делаю 4 сервера, но работают только 2 сервера.
Я написал тестовый код для 10 клиентов, чтобы каждый отправлял по 100 запросов. Однако из портов 8001, 8002, 8003 и 8004 только порты 8001 и 8003 получают соединения от 5 клиентов каждый, и каждый клиент отправляет 100 запросов. Кажется, с циклическим перебором что-то не так, но я не уверен, что именно.
def relay_traffic(self, client_socket, protocol, data):
"""Forward client request to server, and respond to client with server's address"""
try:
server_info = self.get_server(protocol)
if not server_info:
client_socket.sendall(json.dumps({"ack": "failed", "msg": "No server available"}).encode())
return
target_address, target_port = server_info['address'], server_info['port']
# Send server address to client
response = json.dumps({"ack": "redirect", "address": target_address[0], "port": target_port})
client_socket.sendall(response.encode())
print(f"→ Redirected to server: {target_address[0]}:{target_port}")
except Exception as e:
print(f"Error relaying {protocol.upper()} request:", e)
finally:
client_socket.close()
def get_server(self, protocol):
with self.lock:
if protocol in self.servers and self.servers[protocol]:
server = self.servers[protocol][self.current_index[protocol]]
self.current_index[protocol] = (self.current_index[protocol] + 1) % len(self.servers[protocol])
return server
else:
print(f"No server registered for {protocol.upper()} protocol")
return None
def start(self):
print("Load balancer has started.")
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8080))
server_socket.listen(5)
while True:
try:
connection_socket, client_address = server_socket.accept()
message = connection_socket.recv(1024).decode()
print(f"← {message}")
# Check if it is a server registration request
data = json.loads(message)
if data.get("cmd") == "register":
threading.Thread(target=self.handle_registration, args=(connection_socket, message)).start()
continue
except json.JSONDecodeError:
pass
# Determine request type
if message.startswith("GET") or message.startswith("POST"):
protocol = "api"
elif message.startswith("TCP") or message:
protocol = "tcp"
elif message.startswith("UDP"):
protocol = "udp"
else:
print("Unknown type::", message)
connection_socket.close()
continue
# Select server with round-robin
with self.lock:
if protocol in self.servers and self.servers[protocol]:
server_info = self.servers[protocol][self.current_index[protocol]]
self.current_index[protocol] = (self.current_index[protocol] + 1) % len(self.servers[protocol])
threading.Thread(target=self.relay_traffic, args=(connection_socket, protocol, message)).start()
else:
print(f"No server registered for {protocol.upper()} protocol")
connection_socket.close()
if __name__ == "__main__":
lb = LoadBalancer()
lb.start()
Подробнее здесь: https://stackoverflow.com/questions/791 ... d-balancer
Что-то не так с дорожным балансировочным устройством с круговым движением? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Импорт классов моделей из других приложений в Джанго с проблемой с круговым импортом
Anonymous » » в форуме Python - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-