5个版本

新版本 0.2.1 2024年8月22日
0.2.0 2024年7月13日
0.1.2 2024年5月27日
0.1.1 2024年4月29日
0.1.0 2024年4月24日

#75 in 嵌入式开发

Download history 184/week @ 2024-04-25 17/week @ 2024-05-02 146/week @ 2024-05-23 22/week @ 2024-05-30 4/week @ 2024-06-06 2/week @ 2024-06-27 6/week @ 2024-07-04 115/week @ 2024-07-11 6/week @ 2024-07-18 51/week @ 2024-07-25 7/week @ 2024-08-01

每月64次下载

MIT/Apache

370KB
7.5K SLoC

ci Cargo Documentation unsafe forbidden Discord Apache MIT

µWheel

µWheel 是一个适用于流和查询的嵌入式聚合管理系统。

有关其设计的更多信息,请参阅此处,并直接在web上试用。

功能

  • 流窗口聚合
  • 内置仓储功能
  • 基于Wheel的查询优化器 + 向量化执行。
  • 使用 low watermarking 支持乱序。
  • 高吞吐量流摄取。
  • 用户定义的聚合。
  • 低空间占用。
  • 增量检查点支持。
  • #[no_std] 兼容(需要 alloc)。

我应该什么时候使用 µWheel?

µWheel 统一了在线流和离线分析查询的聚合管理。µWheel 不是一个通用解决方案,而是一个针对预定义聚合函数定制的专用系统。

µWheel 是一个很好的选择,当

  • 您事先知道聚合函数。
  • 您需要高吞吐量乱序流摄取。
  • 您需要支持流窗口查询(例如,滑动/滚动)。
  • 您需要支持历史数据的探索性分析。
  • 您需要一个轻量级且高度可嵌入的解决方案。

示例用例

预定义聚合器

函数 描述 类型 SIMD
求和 所有输入的和 u16, u32, u64, i16, i32, i64, f32, f64
MIN 所有输入的最小值 u16, u32, u64, i32, i16, i64, f32, f64
MAX 所有输入的最大值 u16, u32, u64, i16, i32, i64, f32, f64
MINMAX 所有输入的最小和最大值 u16, u32, u64, i16, i32, i64, f32, f64
AVG 所有输入的算术平均值 u16, u32, u64, i16, i32, i64, f32, f64
ALL 预计算的 SUM, AVG, MIN, MAX, COUNT f64
TOP N 所有输入中的前N个 Aggregator,实现Ord的聚合数据

查看用户定义的聚合器示例这里

特性标志

  • std(默认启用)
    • 启用依赖标准库的特性
  • sum(默认启用)
    • 启用求和聚合
  • avg(默认启用)
    • 启用平均值聚合
  • min(默认启用)
    • 启用最小值聚合
  • max(默认启用)
    • 启用最大值聚合
  • min_max(默认启用)
    • 启用最小-最大聚合
  • all(默认启用)
    • 启用所有聚合
  • top_n
    • 启用 Top-N 聚合
  • simd(需要 nightly
    • 启用支持使用 SIMD 操作加速聚合函数
  • sync(隐式启用 std
    • 启用可跨线程共享和查询的 ReaderWheel 的同步版本
  • profiler(隐式启用 std
    • 启用记录各种操作的延迟
  • serde
    • 启用 serde 支持
  • timer
    • 启用调度用户定义的函数

使用方法

用于 std 支持和内置聚合器的编译

uwheel  = "0.2.1"

用于 no_std 支持和最短编译时间

uwheel = { version = "0.2.1", default-features = false }

示例

以下代码来自 hello world 示例。

use uwheel::{aggregator::sum::U32SumAggregator, WheelRange, NumericalDuration, Entry, RwWheel};

// Initial start watermark 2023-11-09 00:00:00 (represented as milliseconds)
let mut watermark = 1699488000000;
// Create a Reader-Writer Wheel with U32 Sum Aggregation using the default configuration
let mut wheel: RwWheel<U32SumAggregator> = RwWheel::new(watermark);

// Install a Sliding Window Aggregation Query (results are produced when we advance the wheel).
wheel.window(Window::sliding(30.minutes(), 10.minutes()));

// Simulate ingestion and fill the wheel with 1 hour of aggregates (3600 seconds).
for _ in 0..3600 {
    // Insert entry with data 1 to the wheel
    wheel.insert(Entry::new(1u32, watermark));
    // bump the watermark by 1 second and also advanced the wheel
    watermark += 1000;

    // Print the result if any window is triggered
    for window in wheel.advance_to(watermark) {
        println!("Window fired {:#?}", window);
    }
}
// Explore historical data - The low watermark is now 2023-11-09 01:00:00

// query the wheel using different intervals
assert_eq!(wheel.read().interval(15.seconds()), Some(15));
assert_eq!(wheel.read().interval(1.minutes()), Some(60));

// combine range of 2023-11-09 00:00:00 and 2023-11-09 01:00:00
let range = WheelRange::new_unchecked(1699488000000, 1699491600000);
assert_eq!(wheel.read().combine_range(range), Some(3600));
// The following runs the the same combine range query as above.
assert_eq!(wheel.read().interval(1.hours()), Some(3600));

查看更多示例 这里

致谢

  • µWheel 从 egui crate 借用了脚本。
  • µWheel 使用了来自 time crate 修改过的 Duration。
  • µWheel 对 @Bathtor 制作的 分层定时轮 进行了软分叉。

贡献

查看 贡献

社区

如果你觉得 µWheel 很有趣并且想了解更多,那么加入 Discord 社区吧!

出版物

  • Max Meldrum,Paris Carbone(2024)。µWheel:流和查询的聚合管理(《最佳论文奖》)。在 DEBS '24。[PDF]

博客文章

引用 µWheel

@inproceedings{meldrum2024uwheel,
  author = {Meldrum, Max and Carbone, Paris},
  title = {μWheel: Aggregate Management for Streams and Queries},
  booktitle = {Proceedings of the 18th ACM International Conference on Distributed and Event-Based Systems},
  year = {2024},
  pages = {54--65},
  doi = {10.1145/3629104.3666031}
}

许可证

在以下许可证下授权:

任选其一。

依赖

~0.7–9MB
~66K SLoC