/async_wrr_queue_rs

rust library crate for async/sync weighted round-robin algorithm, commonly used as a payload balance method.

Primary LanguageRust

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