#async #load-balancing #round-robin #high-performance #weighted-round-robin

async_wrr_queue

[async & high performance] queued weighted round-robin load balance algorithm

3 releases

0.1.2 Feb 1, 2024
0.1.1 Dec 18, 2023
0.1.0 Dec 18, 2023

#553 in Algorithms

28 downloads per month

MIT license

15KB
267 lines

Async WRR Queue

this is a wrapping of weighted round-robin schedule algorithm, utilizing atomic operation and cache queue in order to avoid lock latency or the schedule latency. And we have used an async RwLock (feature default or tokio) to overcome the conflict of select instance and recalculate queue.

crate.io github actions License: MIT

  • async interface for tokio
  • Atomic operation aimed to provide the best run-time performance
  • dynamic insert supported

more detailed documented WrrQueue | Instance

Example

use async_wrr_queue::*;

#[tokio::main]
async fn main() {
    let mut queue = WrrQueue::new();
    
    // insert many 
    queue.insert_many(vec![("a", 1usize), ("b", 2usize)]).await;
    
    // insert one
    queue.insert(("c", 3usize)).await;
    queue.insert_many(vec![("d", 5usize), ("e", 2usize)]).await;
    let mut expected = [
        "d", "c", "b", "d", "e", "d", "c", "a", "d", "b", "e", "c", "d",
    ]
        .iter()
        .cycle();
    for _ in 0..30 {
        
        // schedule!
        let select = queue.select().await;
        assert_eq!(expected.next().unwrap(), select.unwrap().data(),);
    }
}

features

  • default : tokio
  • tokio : async interface, using tokio::sync::RwLock to guarantee best performance
  • blocking : not compatible with tokio, using std::sync::RwLock for blocking acquire

Dependencies

~2.8–4.5MB
~76K SLoC