Skip to content

Commit bcf858d

Browse files
committed
feat: Rust Server Implementation
1 parent f3ec9f7 commit bcf858d

File tree

13 files changed

+258
-2
lines changed

13 files changed

+258
-2
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[workspace]
2+
members = ["demo/server/rust-example"]

demo/server/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Server Demos
2+
3+
These servers are built to reflect the various languages to setup an edge service.
4+
5+
An Edge service's idea is to simply and solely connect a player's connection to a game server via kafka.

demo/server/rust-example/.gitignore

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# BEGIN: Rust
2+
# Generated by Cargo
3+
# https://git.io/JvCJW
4+
5+
# Compiled files
6+
/target/
7+
8+
# Dependency files
9+
Cargo.lock
10+
11+
# Generated files
12+
Cargo.toml.orig
13+
Cargo.toml.bkp
14+
15+
# Output files
16+
*.rs.bk
17+
18+
# END: Rust

demo/server/rust-example/Cargo.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,19 @@
22
name = "rust-example"
33
version = "0.1.0"
44
edition = "2021"
5+
publish = false
56

67
[dependencies]
8+
axum = { version = "0.7", features = ["ws", "tokio"] }
9+
# axum-server = { version = "0.7", features = ["tls-rustls"] }
10+
axum-extra = { version = "0.9.3", features = ["typed-header"] }
11+
futures = "0.3"
12+
futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] }
13+
headers = "0.4"
14+
tokio = { version = "1.4", features = ["full"] }
15+
tokio-tungstenite = "0.23"
16+
tower = { version = "0.5", features = ["util"] }
17+
tower-http = { version = "0.5", features = ["fs", "trace"] }
18+
tracing = "0.1"
19+
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
20+
rdkafka = { version = "0.36.2", features = ["cmake-build"] }
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
pub struct Client
2+
{
3+
id: i64,
4+
}
5+
6+
impl Client
7+
{
8+
pub fn new(id: i64) -> Client
9+
{
10+
Client
11+
{
12+
id,
13+
}
14+
}
15+
16+
pub fn get_id(&self) -> i64
17+
{
18+
self.id
19+
}
20+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub trait LoadBalancer {
2+
fn next(&mut self) -> &mut super::server::Server;
3+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use crate::api::{loadbalancer::LoadBalancer, server::Server};
2+
3+
pub struct LeastConnections {
4+
servers: Vec<Server>
5+
}
6+
7+
impl LoadBalancer for LeastConnections {
8+
fn next(&mut self) -> &mut Server {
9+
let mut min = usize::MAX;
10+
let mut index = 0;
11+
for (i, server) in self.servers.iter().enumerate() {
12+
if server.get_clients().len() < min {
13+
min = server.get_clients().len();
14+
index = i;
15+
}
16+
}
17+
&mut self.servers[index]
18+
}
19+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Least Connection Rounded Robin Load Balancer
2+
// This load balancer selects the server with the least number of active connections.
3+
// This is done by iterating through the servers, finding the average number of clients and round robin selecting the servers below the average.
4+
5+
use crate::api::{loadbalancer::LoadBalancer, server::Server};
6+
7+
pub struct LeastConnectionsRoundRobin {
8+
servers: Vec<Server>,
9+
current: i32,
10+
}
11+
12+
impl LoadBalancer for LeastConnectionsRoundRobin {
13+
fn next(&mut self) -> &mut Server {
14+
let mut average: i32 = 0;
15+
{
16+
let mut total_clients: i32 = 0;
17+
for server in self.servers.iter() {
18+
let clients = server.get_clients().len() as i32;
19+
total_clients += clients;
20+
average += clients;
21+
}
22+
23+
average /= total_clients;
24+
}
25+
26+
let mut index = 0;
27+
for _ in 0..self.servers.len() {
28+
self.current = (self.current + 1) % self.servers.len() as i32;
29+
let clients = self.servers[self.current as usize].get_clients().len() as i32;
30+
if clients < average {
31+
index = self.current;
32+
break;
33+
}
34+
}
35+
36+
&mut self.servers[index as usize]
37+
}
38+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod roundrobin;
2+
pub mod leastconnections;
3+
pub mod leastconnectionsroundrobin;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
use crate::api::loadbalancer::LoadBalancer;
2+
3+
pub struct RoundRobin {
4+
servers: Vec<super::super::server::Server>,
5+
current: i32,
6+
}
7+
8+
impl LoadBalancer for RoundRobin {
9+
fn next(&mut self) -> &mut crate::api::server::Server {
10+
self.current = (self.current + 1) % self.servers.len() as i32;
11+
&mut self.servers[self.current as usize]
12+
}
13+
}

0 commit comments

Comments
 (0)