#batch #cache #data-loader #key-value

ultra-batch

基于 Tokio 的库,用于批处理和缓存数据库查询或其他数据查找

4 个版本 (2 个破坏性更改)

0.3.0 2024年4月28日
0.2.0 2022年2月15日
0.1.1 2020年8月20日
0.1.0 2020年8月17日

#265异步

Download history 112/week @ 2024-05-04 103/week @ 2024-05-11 73/week @ 2024-05-18 45/week @ 2024-05-25 44/week @ 2024-06-01 38/week @ 2024-06-08 36/week @ 2024-06-15 34/week @ 2024-06-22 39/week @ 2024-06-29 22/week @ 2024-07-06 37/week @ 2024-07-13 5/week @ 2024-07-20 24/week @ 2024-07-27 32/week @ 2024-08-03 65/week @ 2024-08-10 42/week @ 2024-08-17

每月163次下载
用于 warpgrapher

MIT/Apache

47KB
583 代码行

ultra-batch

Crate Docs Tests

ultra-batch 是一个 Rust 库,用于批处理和缓存数据库查询或其他可能昂贵的数据库查找。该库的主要动机是解决在 GraphQL 和其他地方看到的“N + 1”查询问题。这个库主要受 GraphQL 基金会的 DataLoader 的启发。它主要设计用于处理数据库查询,但也可以用于批处理任何可能昂贵的数据库加载操作。

使用示例

首先,将 tokioasync-traitanyhow(可选)作为依赖项添加。

use async_trait::async_trait;
use ultra_batch::{Fetcher, Batcher, Cache};

#[derive(Debug, Clone)]
struct User {
    id: u64,
    // User model from your DB, etc.
}

struct UserFetcher {
    // Database connection, etc.
}

#[async_trait]
impl Fetcher for UserFetcher {
    // The thing we can use to look up a single `User` (like an ID)
    type Key = u64;

    // The thing we are trying to look up
    type Value = User;

    // Used to indicate the batch request failed (DB connection failed, etc)
    type Error = anyhow::Error;

    // Fetch a batch of users
    async fn fetch(
        &self,
        keys: &[Self::Key],
        values: &mut Cache<'_, Self::Key, Self::Value>,
    ) -> Result<(), Self::Error> {
        let users: Vec<User> = todo!(); // Fetch users based on the given keys
        for user in users {
            values.insert(user.id, user); // Insert all users we found
        }

        Ok(())
    }
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let fetcher = UserFetcher { /* ... */ };
    let batcher = Batcher::build(fetcher).finish();

    // Retrieve a user by ID. If `load` gets called in other tasks/threads
    // at the same time, then all the requested IDs will get batched together
    let user = batcher.load(123).await?;

    println!("User: {:?}", user);

    Ok(())
}

最低支持的 Rust 版本 (MSRV)

ultra-batch 目前支持 Rust v1.56。MSRV 的更改记录在 变更日志 中。

其他项目

许可

许可协议为 MIT 许可证或 Apache 2.0 许可证(许可证持有人选择)。

依赖项

~3.5–5.5MB
~87K SLoC