fusen_rs/handler/
loadbalance.rs1use crate::{error::FusenError, protocol::fusen::context::FusenContext};
2use fusen_internal_common::{BoxFutureV2, resource::service::ServiceResource};
3use rand::Rng;
4use std::sync::Arc;
5
6#[allow(async_fn_in_trait)]
7pub trait LoadBalance {
8 async fn select<'a>(
9 &'a self,
10 context: &'a FusenContext,
11 invokers: Arc<Vec<Arc<ServiceResource>>>,
12 ) -> Result<Option<Arc<ServiceResource>>, FusenError>;
13}
14
15pub trait LoadBalance_: Send + Sync {
16 fn select_<'a>(
17 &'a self,
18 context: &'a FusenContext,
19 invokers: Arc<Vec<Arc<ServiceResource>>>,
20 ) -> BoxFutureV2<'a, Result<Option<Arc<ServiceResource>>, FusenError>>;
21}
22
23pub struct DefaultLoadBalance;
24
25impl LoadBalance_ for DefaultLoadBalance {
26 fn select_(
27 &'_ self,
28 _context: &'_ FusenContext,
29 invokers: Arc<Vec<Arc<ServiceResource>>>,
30 ) -> BoxFutureV2<'_, Result<Option<Arc<ServiceResource>>, FusenError>> {
31 Box::pin(async move {
32 if invokers.is_empty() {
33 return Ok(None);
34 }
35 let mut thread_rng = rand::rng();
36 Ok(Some(
37 invokers[thread_rng.random_range(0..invokers.len())].clone(),
38 ))
39 })
40 }
41}