Crate burger

source ·
Expand description

An experimental service framework.

The Service trait is the central abstraction. It is an asynchronous function, accepting a request and returning a response, which can only be executed after a permit is acquired.

The root exports Service constructors, and an extension trait, ServiceExt containing combinators to modify a Service. Both the combinators and constructors each have an associated module containing related documentation, traits, and types.

§Example

use burger::*;

let svc = service_fn(|x| async move {
    sleep(Duration::from_secs(1)).await;
    2 * x
})
.map(|x| x + 3)
.concurrency_limit(1)
.buffer(3)
.load_shed();
let response = svc.oneshot(30).await;
assert_eq!(Ok(63), response);

§Usage

A typical Service will consist of distinct layers, each providing specific dynamics. The following flowchart attempts to categorize the exports of this crate:

---
title: Which constructor should I use?
---
flowchart TD
    A{I want to...} --> |Create a fresh service| B{Using a...}
    B --> |Closure| service_fn
    B --> |tower::Service| compat
    A --> |Modify an existing service| C{ }
    C --> |Modify the permit| D{ }
    D --> |Extend lifetime of permit| ServiceExt::leak
    D --> |Reduce backpressure| E{ }
    E --> |Buffer| ServiceExt::buffer
    E --> |Remove backpressure| ServiceExt::depressurize
    E --> |Shed load| ServiceExt::load_shed
    D --> |Increase backpressure| F{ }
    F --> |Limit concurrency| ServiceExt::concurrency_limit
    F --> |Limit rate| ServiceExt::rate_limit
    C --> |Modify response| G{ }
    G --> |Synchronously| ServiceExt::map
    G --> |Asychronously| ServiceExt::then
    C --> |Consolidate service types| ServiceExt::left/right
    C --> |Add retries| ServiceExt::retry
    A --> |Combine existing services| H{By directing \nrequests via...}
    H --> |Manual picking| steer
    H --> |First permitted| select
    H --> |Load balancer| balance
  

Modules§

Structs§

Traits§

Functions§