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

async_wrr_queue

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

4 releases

0.1.3 Aug 21, 2024
0.1.2 Feb 1, 2024
0.1.1 Dec 18, 2023
0.1.0 Dec 18, 2023

#642 in Algorithms

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.

LinkToCratesIO

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;

    // schedule!
    let mut result = Vec::new();
    for _ in 0..30 {
      result.push(queue.select().await.unwrap().data().clone());
    }

    // expected to be this sequence:
    assert_eq!(result, Vec::from_iter( [ "d", "c", "b", "d", "e", "d", "c", "a", "d", "b", "e", "c", "d"].into_iter().cycle().take(30)));
}

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.7–8.5MB
~75K SLoC