#volo #limiter #service #concurrency #layer #requests #request

nightly volo-concurrency-limiter

为 Volo 实现的并发限制器

1 个不稳定版本

0.1.0 2023年11月30日

#11 in #volo

MIT/Apache

360KB
81 行代码

Volo

该软件包实现了基于 Volo 的服务的并发限制器层。

注意

如果服务调用过程中不包含任何异步操作,此软件包中的限制器可能无法限制。这可能会发生在一些纯计算服务器和缓存服务器上。

原因在于,如果没有异步操作,请求的处理过程(服务的 call 方法)变成“原子的”,每个工作线程将不会开始处理新的请求,直到当前请求完成。基于这种情况,可能的最高并发数是工作线程的数量(通常等于逻辑 CPU 线程的数量),可能永远达不到配置的限制。

快速入门

Volo gRPC 服务器

将所需的依赖项添加到 Cargo.toml 文件中

[dependencies]
# -- snip --
volo-concurrency-limiter = { version = "*", features = ["volo-grpc"] }
# -- snip --

将中间件层添加到服务器,如下所示

use std::net::SocketAddr;

use volo_grpc::server::{Server, ServiceBuilder};

use volo_example::S;
use volo_concurrency_limiter::ConcurrencyLimiterServiceLayer;

#[volo::main]
async fn main() {
    let addr: SocketAddr = "[::]:8080".parse().unwrap();
    let addr = volo::net::Address::from(addr);

    Server::new()
        .add_service(ServiceBuilder::new(volo_gen::volo::example::ItemServiceServer::new(S)).build())
        .layer_front(ConcurrencyLimiterServiceLayer::new(100)) // which configures the max concurrency to be 100
        .run(addr)
        .await
        .unwrap();
}

Volo Thrift 服务器

将所需的依赖项添加到 Cargo.toml 文件中

[dependencies]
# -- snip --
volo-concurrency-limiter = { version = "*", features = ["volo-thrift"] }
# -- snip --

将中间件层添加到服务器,如下所示

use std::net::SocketAddr;

use volo_example::{S};
use volo_concurrency_limiter::ConcurrencyLimiterServiceLayer;

#[volo::main]
async fn main() {
    let addr: SocketAddr = "[::]:8080".parse().unwrap();
    let addr = volo::net::Address::from(addr);

    volo_gen::volo::example::ItemServiceServer::new(S)
        .layer_front(ConcurrencyLimiterServiceLayer::new(10))
        .run(addr)
        .await
        .unwrap();
}

许可协议

Volo 采用了 MIT 许可证和 Apache 许可证(版本 2.0)的双重许可。

有关详细信息,请参阅 LICENSE-MITLICENSE-APACHE

社区

依赖项

~10–21MB
~279K SLoC