Skip to content

Latest commit

 

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

hydra-sync is a super light-weight e2e reusable SPMC cluster network abstraction, which try to focus on fast & reliable data broadcasting, with minimal memory usage, latency and maximum throughput.

Features:

  • Fearlessly concurrent session for large number of clients
  • AES-GCM 256 encryption for secure communication
  • Cheap-copy broadcast to multiple consumers
  • Backpressure with proper Head of line blocking prevention
  • Observable metrics for monitoring and debugging
  • Cross-lang client net protocol (e.g. C++, Python, Go, etc.)

Example:

use hydra_sync::client::{HydraClient, Producer, Consumer};
use hydra_sync::server::HydraServer;
use std::net::SocketAddr;
use anyhow::Result;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let (server_handle, server_addr) = HydraServer::bind_default().await?; // bind to os-assigned port
    let session_id = [0xFFu8; 64];
    let session_key = [0xAAu8; 32];

    tokio::spawn(async move { let _ = server_handle.run().await; }); // run in background

    // Producer; sends data to all consumers in the session
    let mut producer =
        HydraClient::<Producer>::connect(server_addr, &session_id, session_key).await?;
    producer.broadcast(b"please date me").await?;

    // Consumer; receives and decrypts frames from the producer
    let mut consumer =
        HydraClient::<Consumer>::connect(server_addr, &session_id, session_key).await?;

    loop {
        let data = consumer.recv().await?;
        println!("Received {} bytes: {:?}", data.len(), data);

        // `data` borrows from `consumer`'s internal memory pool and is
        // only valid until the next `recv()` call.
        // Copy it out (e.g. `data.to_vec()`) if you need to keep it longer.
        break;
    }

    // clean FIN shutdown
    producer.close().await?;
    consumer.close().await?;

    Ok(())
}

References: https://rigtorp.se/ringbuffer/

Benchmark:

# run `cargo bench --bench channel`

hydra-sync 'channel' bench | 6 warmup + 14 rounds x 5000000 ops | cpus=24
push/64B/cap1024                         [ 255.55ms  263.26ms  265.55ms  267.51ms  268.14ms  268.61ms  269.90ms  270.03ms  271.32ms  271.57ms  273.37ms  280.78ms  282.85ms  301.80ms]
                                          median: 54.0065 ns/op | 18.5163 M ops/sec
push/256B/cap1024                        [ 268.53ms  271.04ms  272.97ms  273.43ms  273.61ms  274.97ms  276.40ms  277.27ms  277.85ms  278.02ms  279.60ms  281.34ms  281.42ms  281.93ms]
                                          median: 55.4545 ns/op | 18.0328 M ops/sec
push_batch_64/64B/cap1024                [ 143.17ms  145.17ms  148.03ms  148.29ms  149.14ms  150.13ms  151.03ms  152.00ms  152.67ms  152.71ms  154.34ms  155.56ms  155.71ms  156.79ms]
                                          median: 30.3997 ns/op | 32.8951 M ops/sec
push_batch_256/64B/cap1024               [ 135.73ms  137.12ms  137.16ms  138.01ms  139.31ms  139.70ms  140.28ms  140.57ms  140.91ms  141.97ms  142.51ms  143.36ms  143.78ms  144.61ms]
                                          median: 28.1146 ns/op | 35.5687 M ops/sec
payload sweep (single, cap 1024)
payload_256B                             [ 270.51ms  272.46ms  276.57ms  276.83ms  277.67ms  277.92ms  278.57ms  279.04ms  280.52ms  280.67ms  281.83ms  284.19ms  285.68ms  286.96ms]
                                          median: 55.8082 ns/op | 17.9185 M ops/sec
payload_1024B                            [ 275.66ms  276.06ms  276.46ms  277.73ms  278.51ms  279.69ms  280.21ms  280.40ms  280.73ms  281.30ms  281.79ms  282.80ms  283.12ms  286.35ms]
                                          median: 56.0807 ns/op | 17.8314 M ops/sec
payload_4096B                            [ 273.13ms  274.98ms  275.68ms  276.02ms  279.80ms  282.42ms  283.18ms  283.18ms  283.68ms  286.70ms  287.10ms  288.54ms  292.39ms  292.81ms]
                                          median: 56.6365 ns/op | 17.6565 M ops/sec
payload_65536B                           [ 279.17ms  280.63ms  283.66ms  283.71ms  284.41ms  286.14ms  286.26ms  290.16ms  291.64ms  292.19ms  293.55ms  293.55ms  297.71ms  301.18ms]
                                          median: 58.0320 ns/op | 17.2319 M ops/sec
capacity sweep (single, 64B)
cap_256                                  [ 255.42ms  266.58ms  267.04ms  268.31ms  268.93ms  269.84ms  270.86ms  272.83ms  274.51ms  274.94ms  276.35ms  276.93ms  278.69ms  286.52ms]
                                          median: 54.5663 ns/op | 18.3263 M ops/sec
cap_1024                                 [ 268.47ms  272.47ms  272.87ms  273.70ms  274.18ms  275.64ms  275.79ms  276.05ms  276.92ms  278.63ms  278.67ms  279.78ms  280.81ms  281.24ms]
                                          median: 55.2094 ns/op | 18.1129 M ops/sec
cap_4096                                 [ 313.69ms  316.43ms  317.25ms  320.35ms  321.58ms  322.63ms  323.01ms  323.02ms  323.43ms  323.49ms  324.02ms  324.09ms  324.85ms  326.29ms]
                                          median: 64.6038 ns/op | 15.4790 M ops/sec
cap_65536                                [ 147.09ms  212.55ms  235.93ms  238.46ms  242.38ms  247.42ms  248.14ms  249.48ms  261.28ms  269.11ms  289.47ms  291.58ms  293.58ms  293.97ms]
                                          median: 49.8953 ns/op | 20.0420 M ops/sec
                                                                                                                                                                                                               
# last updated on 08/27/2026, rust 1.98.0, i7 14650hx
# run `cargo bench --bench server`

hydra-sync 'server' e2e bench | 3 warmup + 8 rounds | 4096 pkts/runs | cpus=24

varying consumers @ 16384B
cons_1                 [   86.3ms    94.3ms    95.6ms    98.7ms   103.1ms   111.0ms   118.5ms   142.2ms]
                        min 21062.7 ns/pkt ( 0.05 M/s) | med 25180.2 ns/pkt ( 0.04 M/s) |   0.65 GB/s
cons_2                 [   58.2ms    59.0ms    59.2ms    59.8ms    60.1ms    62.2ms    64.1ms    85.7ms]
                        min  7099.0 ns/pkt ( 0.14 M/s) | med  7335.3 ns/pkt ( 0.14 M/s) |   2.23 GB/s
cons_4                 [   61.1ms    65.3ms    65.9ms    69.7ms    71.2ms    77.8ms    78.0ms    81.9ms]
                        min  3729.9 ns/pkt ( 0.27 M/s) | med  4345.4 ns/pkt ( 0.23 M/s) |   3.77 GB/s
cons_8                 [   79.2ms    81.5ms    81.7ms    81.8ms    82.5ms    83.2ms    83.8ms    89.2ms]
                        min  2417.2 ns/pkt ( 0.41 M/s) | med  2518.5 ns/pkt ( 0.40 M/s) |   6.51 GB/s
cons_16                [  116.1ms   116.3ms   118.0ms   118.4ms   118.4ms   121.0ms   122.0ms   126.8ms]
                        min  1770.8 ns/pkt ( 0.56 M/s) | med  1806.6 ns/pkt ( 0.55 M/s) |   9.07 GB/s

varying payload @ 4 consumers
payload_256            [   38.2ms    41.8ms    42.9ms    43.9ms    45.3ms    45.9ms    46.1ms    46.9ms]
                        min  2332.1 ns/pkt ( 0.43 M/s) | med  2762.9 ns/pkt ( 0.36 M/s) |   0.09 GB/s
payload_1024           [   35.3ms    38.9ms    39.8ms    42.9ms    44.2ms    45.9ms    46.2ms    49.9ms]
                        min  2152.8 ns/pkt ( 0.46 M/s) | med  2700.1 ns/pkt ( 0.37 M/s) |   0.38 GB/s
payload_16384          [   61.7ms    61.9ms    63.3ms    63.5ms    63.6ms    63.6ms    66.0ms    74.2ms]
                        min  3767.0 ns/pkt ( 0.27 M/s) | med  3880.2 ns/pkt ( 0.26 M/s) |   4.22 GB/s
payload_131072         [  291.8ms   294.5ms   294.6ms   296.5ms   298.1ms   303.1ms   310.2ms   310.4ms]
                        min 17809.8 ns/pkt ( 0.06 M/s) | med 18195.9 ns/pkt ( 0.05 M/s) |   7.20 GB/s
payload_1048576        [ 9651.7ms  9807.1ms  9874.0ms  9876.4ms  9918.0ms 10010.6ms 10303.8ms 10326.1ms]
                        min 589092.3 ns/pkt ( 0.00 M/s) | med 605345.9 ns/pkt ( 0.00 M/s) |   1.73 GB/s
                        
# last updated on 08/27/2026, rust 1.98.0, i7 14650hx

About

Light-weight zero-copy E2E Single Producer Multiple Consumer network cluster library

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages