Skip to main content

fusen_rs/handler/
loadbalance.rs

1use 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}