Low latency batching tool. Bundle lots of single concurrent operations into sequential batches of work.
use benjamin_batchly::{BatchMutex, BatchResult};
let batcher = BatchMutex::default();
// BatchMutex synchronizes so only one `Work` happens at a time (for a given batch_key).
// All concurrent submissions made while an existing `Work` is being processed will
// await completion and form the next `Work` batch.
match batcher.submit(batch_key, item).await {
BatchResult::Work(mut batch) => {
db_bulk_insert(&batch.items).await?;
batch.notify_all_done();
Ok(())
}
BatchResult::Done(_) => Ok(()),
BatchResult::Failed => Err("failed"),
}