mirror of
https://github.com/tokio-rs/axum.git
synced 2025-01-01 08:56:15 +01:00
More notes on backpressure
This commit is contained in:
parent
099e886575
commit
09f76f3c87
3 changed files with 17 additions and 15 deletions
|
@ -29,13 +29,6 @@
|
||||||
//! # };
|
//! # };
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! Technically extractors can also be used as "guards", for example to require
|
|
||||||
//! that requests are authorized. However the recommended way to do that is
|
|
||||||
//! using Tower middleware, such as [`tower_http::auth::RequireAuthorization`].
|
|
||||||
//! Extractors have to be applied to each handler, whereas middleware can be
|
|
||||||
//! applied to a whole stack at once, which is typically what you want for
|
|
||||||
//! authorization.
|
|
||||||
//!
|
|
||||||
//! # Defining custom extractors
|
//! # Defining custom extractors
|
||||||
//!
|
//!
|
||||||
//! You can also define your own extractors by implementing [`FromRequest`]:
|
//! You can also define your own extractors by implementing [`FromRequest`]:
|
||||||
|
|
|
@ -485,7 +485,8 @@
|
||||||
//! # };
|
//! # };
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! See the [`service`] module for more details.
|
//! Routing to arbitrary services in this way has complications for backpressure
|
||||||
|
//! ([`Service::poll_ready`]). See the [`service`] module for more details.
|
||||||
//!
|
//!
|
||||||
//! # Nesting applications
|
//! # Nesting applications
|
||||||
//!
|
//!
|
||||||
|
|
|
@ -28,8 +28,8 @@
|
||||||
//!
|
//!
|
||||||
//! Generally routing to one of multiple services and backpressure doesn't mix
|
//! Generally routing to one of multiple services and backpressure doesn't mix
|
||||||
//! well. Ideally you would want ensure a service is ready to receive a request
|
//! well. Ideally you would want ensure a service is ready to receive a request
|
||||||
//! before calling the service. However in order to know which service to call
|
//! before calling the it. However in order to know which service to call you
|
||||||
//! you need the request...
|
//! need the request...
|
||||||
//!
|
//!
|
||||||
//! One approach is to not consider the router service itself ready until all
|
//! One approach is to not consider the router service itself ready until all
|
||||||
//! destination services are ready. That is the approach used by
|
//! destination services are ready. That is the approach used by
|
||||||
|
@ -37,15 +37,22 @@
|
||||||
//!
|
//!
|
||||||
//! Another approach is to always consider all services ready (always return
|
//! Another approach is to always consider all services ready (always return
|
||||||
//! `Poll::Ready(Ok(()))`) from `Service::poll_ready` and then actually drive
|
//! `Poll::Ready(Ok(()))`) from `Service::poll_ready` and then actually drive
|
||||||
//! readiness inside the response future. This works well when your services
|
//! readiness inside the response future returned by `Service::call`. This works
|
||||||
//! don't care about backpressure and are always ready anyway.
|
//! well when your services don't care about backpressure and are always ready
|
||||||
|
//! anyway.
|
||||||
//!
|
//!
|
||||||
//! tower-web expects that most services used in your app wont care about
|
//! tower-web expects that all services used in your app wont care about
|
||||||
//! backpressure and so it uses the latter strategy. However that means you
|
//! backpressure and so it uses the latter strategy. However that means you
|
||||||
//! should avoid routing to a service (or using a middleware) that _does_ care
|
//! should avoid routing to a service (or using a middleware) that _does_ care
|
||||||
//! about backpressure. At the very least you should [load shed] so requests are
|
//! about backpressure. At the very least you should [load shed] so requests are
|
||||||
//! dropped quickly and don't keep piling up.
|
//! dropped quickly and don't keep piling up.
|
||||||
//!
|
//!
|
||||||
|
//! It also means if `poll_ready` returns an error that error will be returned
|
||||||
|
//! in the response future from `call`, and _not_ from `poll_ready`. In that
|
||||||
|
//! case the underlying service will _not_ be discarded and will continue to be
|
||||||
|
//! used for future requests. Services that expect to be discarded if
|
||||||
|
//! `poll_ready` fails should _not_ be used with tower-web.
|
||||||
|
//!
|
||||||
//! One possible approach is to only apply backpressure sensitive middleware
|
//! One possible approach is to only apply backpressure sensitive middleware
|
||||||
//! around your entire app. This is possible because tower-web applications are
|
//! around your entire app. This is possible because tower-web applications are
|
||||||
//! themselves services:
|
//! themselves services:
|
||||||
|
@ -66,11 +73,12 @@
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! However when applying middleware around your whole application in this way
|
//! However when applying middleware around your whole application in this way
|
||||||
//! you have to take care that errors are still being dealt with appropriately.
|
//! you have to take care that errors are still being handled with
|
||||||
|
//! appropriately.
|
||||||
//!
|
//!
|
||||||
//! Also note that handlers created from async functions don't care about
|
//! Also note that handlers created from async functions don't care about
|
||||||
//! backpressure and are always ready. So if you're not using any Tower
|
//! backpressure and are always ready. So if you're not using any Tower
|
||||||
//! middleware you don't have to worry about backpressure.
|
//! middleware you don't have to worry about any of this.
|
||||||
//!
|
//!
|
||||||
//! [`Redirect`]: tower_http::services::Redirect
|
//! [`Redirect`]: tower_http::services::Redirect
|
||||||
//! [load shed]: tower::load_shed
|
//! [load shed]: tower::load_shed
|
||||||
|
|
Loading…
Reference in a new issue