pub struct CircuitBreakerExecutor<S> { /* private fields */ }Expand description
给任意 SqlExecutor 包一层熔断。
每个端点各包一个 —— 不是包在路由外层:那样单个从库故障会误熔断整条链路 (spec:225)。熔断打开时内层一次都不会被调用。
Implementations§
Source§impl<S> CircuitBreakerExecutor<S>
impl<S> CircuitBreakerExecutor<S>
pub fn new(inner: S, cfg: BreakerConfig) -> Self
Sourcepub fn state(&self) -> BreakerState
pub fn state(&self) -> BreakerState
供 RdbmsRouting 跳过已熔断的端点。
pub fn inner(&self) -> &S
Trait Implementations§
Source§impl<S: RdbmsClient> RdbmsClient for CircuitBreakerExecutor<S>
impl<S: RdbmsClient> RdbmsClient for CircuitBreakerExecutor<S>
Source§fn transaction<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Transaction, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn transaction<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Transaction, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
事务不经熔断,直接委托内层。
两件事要分清:
- 把熔断套到事务上 —— 要在
TransactionInner层面再包一层,代价大于收益(不做) - 把
transaction()委托给内层 —— 就是这三行(要做):端点要能装进Arc<dyn RdbmsClient>,而事务天然走 primary,失败由 SQL 层报错。
Source§impl<S: SqlExecutor> SqlExecutor for CircuitBreakerExecutor<S>
impl<S: SqlExecutor> SqlExecutor for CircuitBreakerExecutor<S>
Source§fn query_write<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
sql: &'life1 str,
params: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = Result<Vec<Row>, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn query_write<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
sql: &'life1 str,
params: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = Result<Vec<Row>, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
写路径的返回行查询:同样受熔断保护 —— 熔断打开的端点连写也不该碰。
Source§fn execute<'life0, 'life1, 'async_trait>(
&'life0 self,
sql: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<u64, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn execute<'life0, 'life1, 'async_trait>(
&'life0 self,
sql: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<u64, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
执行一条 SQL 语句,返回受影响行数。
用户提供的值请走
SqlExecutor::execute_with。Source§fn query<'life0, 'life1, 'async_trait>(
&'life0 self,
sql: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<Row>, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn query<'life0, 'life1, 'async_trait>(
&'life0 self,
sql: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<Row>, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
查询多行。用户提供的值请走
SqlExecutor::query_with。Source§fn execute_with<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
sql: &'life1 str,
params: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = Result<u64, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn execute_with<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
sql: &'life1 str,
params: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = Result<u64, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
参数化执行,防注入。无法绑定参数的后端返回错误。
Source§fn query_with<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
sql: &'life1 str,
params: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = Result<Vec<Row>, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn query_with<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
sql: &'life1 str,
params: &'life2 [Value],
) -> Pin<Box<dyn Future<Output = Result<Vec<Row>, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
参数化查询,防注入。无法绑定参数的后端返回错误。
Source§fn execute_then_query<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
first: &'life1 str,
first_params: &'life2 [Value],
second: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<Row>, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn execute_then_query<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
first: &'life1 str,
first_params: &'life2 [Value],
second: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<Row>, RdbmsError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Auto Trait Implementations§
impl<S> !Freeze for CircuitBreakerExecutor<S>
impl<S> !RefUnwindSafe for CircuitBreakerExecutor<S>
impl<S> !UnwindSafe for CircuitBreakerExecutor<S>
impl<S> Send for CircuitBreakerExecutor<S>where
S: Send,
impl<S> Sync for CircuitBreakerExecutor<S>where
S: Sync,
impl<S> Unpin for CircuitBreakerExecutor<S>where
S: Unpin,
impl<S> UnsafeUnpin for CircuitBreakerExecutor<S>where
S: UnsafeUnpin,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::Request