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