#tcp-server #非阻塞 #http-server #event-bus #vertx #集群

nightly vertx-rust

vertx-rust是一个简单的vertx tcp事件总线、tcp服务器和http服务器Rust版本

30次发布

0.8.6 2024年5月24日
0.8.5 2023年6月16日
0.8.1 2023年5月29日
0.7.0 2023年3月13日
0.1.1 2020年12月25日

#77 in HTTP客户端

Download history 144/week @ 2024-05-24 3/week @ 2024-05-31 1/week @ 2024-06-07 1/week @ 2024-06-28 16/week @ 2024-07-05 100/week @ 2024-07-26 7/week @ 2024-08-02

每月107次下载

自定义许可

105KB
2.5K SLoC

vertx-rust

Platform License Rust Crates.io

简介

vertx-rustvert.x 在Rust中的简单实现。vertx-rust引擎基于crossbeam-channeltokio,作为一个多线程非阻塞事件驱动引擎。目前,唯一实现是基于zookeeper作为集群管理器和独立实例的集群版本。未来还将有其他集群管理器的实现。

功能

  1. 非阻塞事件总线消费者 | local_consumer
  2. 非阻塞事件总线请求
  3. 非阻塞事件总线发送
  4. 非阻塞事件总线发布
  5. 非阻塞多线程tcp服务器 - 基于 tokio
  6. 非阻塞多线程http服务器 - 基于 hyper
  7. 阻塞和非阻塞简单的 hyper http客户端包装器
  8. Zookeeper集群管理器

基准测试

在AMD Ryzen 7 3800X上的基准测试

Wrk基准测试

来自 no_cluster 示例的http服务器

wrk -d 90s -t 5 -c 500 http://127.0.0.1:9092/
Running 2m test @ http://127.0.0.1:9092/
  5 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.36ms  715.49us  26.70ms   70.35%
    Req/Sec    74.64k     8.17k   92.34k    59.76%
  33426081 requests in 1.50m, 3.89GB read
Requests/sec: 371207.38
Transfer/sec:     44.25MB

来自 no_cluster 示例的tcp服务器

wrk -d 90s -t 5 -c 500 http://127.0.0.1:9091/
Running 2m test @ http://127.0.0.1:9091/
  5 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.45ms  768.63us  11.52ms   70.22%
    Req/Sec    70.55k     8.68k    103.19k    75.66%
  31591444 requests in 1.50m, 3.56GB read
Requests/sec: 350878.94
Transfer/sec:     40.49MB

微型基准测试

serialize_cycles        time:   [260.7716 cycles 261.2144 cycles 261.6987 cycles]           
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) low mild
  3 (3.00%) high mild
  3 (3.00%) high severe

deserialize_cycles      time:   [325.4613 cycles 325.8329 cycles 326.2337 cycles]             
Found 6 outliers among 100 measurements (6.00%)
  4 (4.00%) high mild
  2 (2.00%) high severe

serialize_message       time:   [66.672 ns 67.425 ns 68.939 ns]                              
Found 3 outliers among 100 measurements (3.00%)
  2 (2.00%) high mild
  1 (1.00%) high severe

deserialize_message     time:   [70.224 ns 70.403 ns 70.592 ns]                                
Found 6 outliers among 100 measurements (6.00%)
  4 (4.00%) high mild
  2 (2.00%) high severe

vertx_request           time:   [4.5056 us 4.5872 us 4.6704 us]                           
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high mild

vertx_send              time:   [274.87 ns 281.62 ns 289.84 ns]                       
Found 8 outliers among 100 measurements (8.00%)
  6 (6.00%) high mild
  2 (2.00%) high severe

vertx_publish           time:   [274.64 ns 279.26 ns 284.22 ns]                          
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high mild

与vertx-rust一起工作

代码示例

事件总线消费者

use vertx_rust::vertx::{VertxOptions, Vertx, NoClusterManager};

let vertx_options = VertxOptions::default();
let vertx : Vertx<NoClusterManager> = Vertx::new(vertx_options);
let event_bus = vertx.event_bus().await;

event_bus.consumer("test.01", move |m, _| {
  Box::pin( async {
    m.reply(..);
  })
});

vertx.start().await;

事件总线发送

use vertx_rust::vertx::{VertxOptions, Vertx, NoClusterManager};

let vertx_options = VertxOptions::default();
let vertx : Vertx<NoClusterManager> = Vertx::new(vertx_options);
let event_bus = vertx.event_bus().await;

event_bus.send("test.01", Body::String("Hello World".to_string()));

事件总线请求

use vertx_rust::vertx::{VertxOptions, Vertx, NoClusterManager};

let vertx_options = VertxOptions::default();
let vertx : Vertx<NoClusterManager> = Vertx::new(vertx_options);
let event_bus = vertx.event_bus().await;

event_bus.request("test.01", Body::String("Hello World".to_string()), move |m, _| {
    Box::pin(async move {
        ...
    })
});

tcp服务器

use vertx_rust::vertx::{VertxOptions, Vertx, NoClusterManager};
use vertx_rust::net::NetServer;

let vertx_options = VertxOptions::default();
let vertx : Vertx<NoClusterManager> = Vertx::new(vertx_options);
let event_bus = vertx.event_bus().await;

let net_server = NetServer::new(Some(event_bus.clone()));
net_server.listen(9091, move |_req, ev| {
  let mut resp = vec![];
  ...
  resp
});

vertx.start().await;

更多示例请参阅:examples

依赖项

~12–26MB
~398K SLoC