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 在 异步 中
每月163次下载
用于 warpgrapher
47KB
583 代码行
ultra-batch
ultra-batch
是一个 Rust 库,用于批处理和缓存数据库查询或其他可能昂贵的数据库查找。该库的主要动机是解决在 GraphQL 和其他地方看到的“N + 1”查询问题。这个库主要受 GraphQL 基金会的 DataLoader 的启发。它主要设计用于处理数据库查询,但也可以用于批处理任何可能昂贵的数据库加载操作。
使用示例
首先,将 tokio
、async-trait
和 anyhow
(可选)作为依赖项添加。
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