#async #负载均衡 #轮询 #tokio #高性能 #加权轮询

async_wrr_queue

[异步 & 高性能] 带权重的循环队列负载均衡算法

4个版本

0.1.3 2024年8月21日
0.1.2 2024年2月1日
0.1.1 2023年12月18日
0.1.0 2023年12月18日

571算法

Download history 1/week @ 2024-07-05 1/week @ 2024-07-19 2/week @ 2024-07-26 106/week @ 2024-08-16

每月 108 次下载

MIT 许可证

15KB
267

Async WRR Queue

这是一个加权轮询调度算法的封装,利用原子操作和缓存队列以避免锁定延迟或调度延迟。我们使用了异步RwLock(功能defaulttokio)来克服选择实例和重新计算队列的冲突。

链接到Crates.io

crate.io github actions License: MIT

  • tokio的异步接口
  • 针对最佳运行时性能的原子操作
  • 支持动态插入

更详细的文档 WrrQueue | Instance

示例

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)));
}

功能

  • default : tokio
  • tokio : 异步接口,使用tokio::sync::RwLock以保证最佳性能
  • blocking : 与tokio不兼容,使用std::sync::RwLock进行阻塞获取

依赖项

~2.7–4.5MB
~75K SLoC