#tower-service #tower-middleware #actor #messages #create #async #task


A tower middleware that creates a Service by passing messages to an actor

1 unstable release

0.1.0 Mar 27, 2023

#1073 in Asynchronous

Download history 372/week @ 2023-12-18 224/week @ 2023-12-25 382/week @ 2024-01-01 382/week @ 2024-01-08 630/week @ 2024-01-15 553/week @ 2024-01-22 1067/week @ 2024-01-29 761/week @ 2024-02-05 879/week @ 2024-02-12 401/week @ 2024-02-19 471/week @ 2024-02-26 422/week @ 2024-03-04 478/week @ 2024-03-11 494/week @ 2024-03-18 860/week @ 2024-03-25 1503/week @ 2024-04-01

3,361 downloads per month


238 lines

A tower::Service backed by an asynchronous actor.

The tower::Service trait is very versatile, and allows writing a wide variety of composable middleware. However, one gap in existing middleware is bridging between the request/response-oriented Service interface, which is primarily designed around the idea that requests are processed independently and asynchronously, and an actor-like model where a stateful actor processes a queue of incoming messages.

Tower does use an actor model in the form of the Buffer middleware for mediating access to a shared Service, by moving the Service into a worker task that pulls request messages from a mpsc, and presenting a Buffer handle that wraps the sender side of the mpsc. This is almost what we want, except that the Buffer can only wrap a Service implementation, and the Service trait isn't quite what we want: while the Service trait's call method allows synchronous mutation of state (via &mut self), it doesn't work well with asynchronous mutation of state (since all asynchronous work has to be done in the response future, which can't have access to the Service state without additional sharing and synchronization setup).

As a result, in Penumbra's pd, we ended up vendoring and forking the Buffer middleware, and using the forked code to wrap hardcoded worker tasks for the consensus and mempool services we present to tower-abci. To make this more general, we extracted it into this crate.


~111K SLoC