Skip to content

Latest commit

 

History

50 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

Features:

  • Backpressure with proper Head of line blocking prevention
  • Cheap-copy broadcast to multiple consumers
  • AES-GCM 256 encryption for secure communication
  • Fearlessly concurrent session for large number of clients
  • 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                         [ 260.76ms  264.16ms  264.22ms  265.33ms  265.78ms  266.67ms  267.36ms  268.64ms  269.96ms  272.20ms  275.08ms  278.35ms  287.51ms  291.71ms]
                                          median:    53.73 ns/op |     18.61 M ops/sec
push/256B/cap1024                        [ 260.49ms  262.39ms  263.43ms  267.10ms  267.56ms  267.83ms  269.37ms  270.30ms  278.08ms  278.31ms  284.73ms  288.94ms  338.92ms  349.09ms]
                                          median:    54.06 ns/op |     18.50 M ops/sec
push_batch_64/64B/cap1024                [ 145.85ms  146.64ms  146.83ms  147.97ms  148.40ms  149.29ms  150.33ms  151.65ms  152.50ms  152.61ms  153.39ms  153.47ms  154.29ms  166.93ms]
                                          median:    30.33 ns/op |     32.97 M ops/sec
push_batch_256/64B/cap1024               [ 133.19ms  134.13ms  136.05ms  136.59ms  137.52ms  138.58ms  139.16ms  139.95ms  141.01ms  141.08ms  142.49ms  145.03ms  145.23ms  147.76ms]
                                          median:    27.99 ns/op |     35.73 M ops/sec
payload sweep (single, cap 1024)
payload_256B                             [ 261.63ms  262.25ms  264.16ms  264.29ms  264.81ms  265.10ms  265.28ms  266.26ms  266.37ms  266.75ms  271.34ms  272.09ms  285.21ms  291.71ms]
                                          median:    53.25 ns/op |     18.78 M ops/sec
payload_1024B                            [ 266.03ms  269.94ms  270.84ms  271.76ms  272.02ms  272.29ms  274.26ms  274.52ms  274.84ms  274.89ms  277.44ms  278.16ms  280.02ms  281.48ms]
                                          median:    54.90 ns/op |     18.21 M ops/sec
payload_4096B                            [ 258.64ms  259.45ms  261.92ms  263.85ms  264.67ms  268.01ms  270.51ms  271.46ms  273.81ms  274.41ms  275.93ms  294.33ms  295.86ms  298.30ms]
                                          median:    54.29 ns/op |     18.42 M ops/sec
payload_65536B                           [ 256.27ms  260.78ms  260.99ms  265.13ms  266.55ms  266.57ms  267.23ms  270.93ms  274.80ms  288.58ms  291.21ms  291.38ms  294.10ms  304.19ms]
                                          median:    54.19 ns/op |     18.45 M ops/sec
capacity sweep (single, 64B)
cap_256                                  [ 177.60ms  264.81ms  264.96ms  266.60ms  269.35ms  272.02ms  272.38ms  273.40ms  277.12ms  279.00ms  279.20ms  279.89ms  296.04ms  348.95ms]
                                          median:    54.68 ns/op |     18.29 M ops/sec
cap_1024                                 [ 249.28ms  261.64ms  262.95ms  264.07ms  266.27ms  267.99ms  271.44ms  272.02ms  274.30ms  274.99ms  278.01ms  292.39ms  293.32ms  298.06ms]
                                          median:    54.40 ns/op |     18.38 M ops/sec
cap_4096                                 [ 109.93ms  305.82ms  310.89ms  315.60ms  317.21ms  319.02ms  319.80ms  320.81ms  322.98ms  325.48ms  365.66ms  373.33ms  376.52ms  380.98ms]
                                          median:    64.16 ns/op |     15.59 M ops/sec
cap_65536                                [ 282.62ms  289.95ms  290.61ms  293.41ms  294.87ms  298.59ms  299.74ms  302.55ms  307.07ms  316.11ms  327.74ms  331.42ms  345.37ms  346.06ms]
                                          median:    60.51 ns/op |     16.53 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/pass | cpus=24

varying consumers @ 16384B
cons_1                 [   91.1ms   100.2ms   113.7ms   115.9ms   126.3ms   128.8ms   141.0ms   149.4ms]
                        min 22248.7 ns/pkt ( 0.04 M/s) | med 30846.3 ns/pkt ( 0.03 M/s) |   0.53 GB/s
cons_2                 [   58.7ms    60.0ms    60.1ms    60.3ms    61.6ms    73.1ms    75.5ms    81.5ms]
                        min  7168.8 ns/pkt ( 0.14 M/s) | med  7520.1 ns/pkt ( 0.13 M/s) |   2.18 GB/s
cons_4                 [   63.8ms    64.2ms    64.4ms    64.5ms    64.9ms    65.3ms    67.3ms    74.2ms]
                        min  3892.3 ns/pkt ( 0.26 M/s) | med  3958.5 ns/pkt ( 0.25 M/s) |   4.14 GB/s
cons_8                 [   84.0ms    84.5ms    85.7ms    86.6ms    90.3ms    90.9ms    91.0ms    98.4ms]
                        min  2562.7 ns/pkt ( 0.39 M/s) | med  2755.6 ns/pkt ( 0.36 M/s) |   5.95 GB/s
cons_16                [  120.0ms   122.4ms   122.9ms   123.1ms   123.6ms   123.9ms   124.9ms   126.6ms]
                        min  1831.7 ns/pkt ( 0.55 M/s) | med  1886.1 ns/pkt ( 0.53 M/s) |   8.69 GB/s

varying payload @ 4 consumers
payload_256            [   37.5ms    45.4ms    46.2ms    46.7ms    47.2ms    48.1ms    48.5ms    48.9ms]
                        min  2289.8 ns/pkt ( 0.44 M/s) | med  2882.9 ns/pkt ( 0.35 M/s) |   0.09 GB/s
payload_1024           [   36.3ms    38.7ms    44.2ms    46.4ms    47.1ms    48.3ms    50.1ms    54.2ms]
                        min  2218.0 ns/pkt ( 0.45 M/s) | med  2875.8 ns/pkt ( 0.35 M/s) |   0.36 GB/s
payload_16384          [   63.2ms    63.9ms    65.3ms    66.1ms    68.5ms    74.9ms    76.5ms    92.1ms]
                        min  3855.7 ns/pkt ( 0.26 M/s) | med  4180.9 ns/pkt ( 0.24 M/s) |   3.92 GB/s
payload_131072         [  294.2ms   294.6ms   295.2ms   295.6ms   298.7ms   299.1ms   301.0ms   306.4ms]
                        min 17958.7 ns/pkt ( 0.06 M/s) | med 18229.5 ns/pkt ( 0.05 M/s) |   7.19 GB/s
payload_1048576        [ 9378.8ms  9601.3ms  9618.2ms  9801.7ms  9812.9ms  9868.6ms  9909.7ms  9917.9ms]
                        min 572434.9 ns/pkt ( 0.00 M/s) | med 598932.0 ns/pkt ( 0.00 M/s) |   1.75 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