背景
async_trait 大幅提升了工程可读性,但在高频路径里也可能引入额外分配和动态分发开销。
选择建议
- 热路径优先泛型静态分发
- 插件式扩展再考虑 trait object
- 先 benchmark 再下结论
pub trait Storage {
fn get<'a>(&'a self, key: &'a str) -> Pin<Box<dyn Future<Output = Option<String>> + Send + 'a>>;
}
总结
抽象不是免费的,但可维护性也有价值,关键是按热点分层。
架构取舍从来不是二选一,而是按场景分配复杂度。