added adaptive weight balancing algorithm

This commit is contained in:
psun256
2025-12-09 18:31:22 -05:00
parent a3f50c1f0a
commit 20b51c2562
13 changed files with 274 additions and 26 deletions

View File

@@ -7,9 +7,9 @@ mod proxy;
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use std::sync::Arc;
use std::sync::atomic::AtomicU64;
use crate::backend::{Backend, BackendPool};
use std::sync::{Arc, RwLock};
use std::sync::atomic::{AtomicU64, Ordering};
use crate::backend::{Backend, BackendPool, ServerHealth};
use crate::balancer::Balancer;
use crate::balancer::round_robin::RoundRobinBalancer;
use crate::proxy::tcp::proxy_tcp_connection;
@@ -18,26 +18,29 @@ static NEXT_CONN_ID: AtomicU64 = AtomicU64::new(1);
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let pool = BackendPool::new();
pool.add(Backend::new(
let mut pool: Vec<Arc<Backend>> = Vec::new();
let server_metric = Arc::new(RwLock::new(ServerHealth::default()));
pool.push(Arc::new(Backend::new(
"backend 1".into(),
"127.0.0.1:8081".parse().unwrap(),
));
server_metric.clone()
)));
pool.add(Backend::new(
pool.push(Arc::new(Backend::new(
"backend 2".into(),
"127.0.0.1:8082".parse().unwrap(),
));
server_metric.clone()
)));
let mut balancer = RoundRobinBalancer::new(pool.clone());
let mut balancer = RoundRobinBalancer::new(BackendPool::new(pool));
let listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (socket, _) = listener.accept().await?;
let conn_id = NEXT_CONN_ID.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
let conn_id = NEXT_CONN_ID.fetch_add(1, Ordering::Relaxed);
if let Some(backend) = balancer.choose_backend() {
tokio::spawn(async move {