# NATS Go Server — Reference Benchmark Numbers Typical throughput and latency figures for the Go NATS server, collected from official documentation and community benchmarks. These serve as performance targets for the .NET port. ## Test Environment Official NATS docs benchmarks were run on an Apple M4 (10 cores: 4P + 6E, 16 GB RAM). Numbers will vary by hardware — treat these as order-of-magnitude targets, not exact goals. --- ## Core NATS — Pub/Sub Throughput All figures use the `nats bench` tool with default 16-byte messages unless noted. ### Single Publisher (no subscribers) | Messages | Payload | Throughput | Latency | |----------|---------|------------|---------| | 1M | 16 B | 14,786,683 msgs/sec (~226 MiB/s) | 0.07 us | ### Publisher + Subscriber (1:1) | Messages | Payload | Throughput (each side) | Latency | |----------|---------|------------------------|---------| | 1M | 16 B | ~4,927,000 msgs/sec (~75 MiB/s) | 0.20 us | | 100K | 16 KB | ~228,000 msgs/sec (~3.5 GiB/s) | 4.3 us | ### Fan-Out (1 Publisher : N Subscribers) | Subscribers | Payload | Per-Subscriber Rate | Aggregate | Latency | |-------------|---------|---------------------|-----------|---------| | 4 | 128 B | ~1,010,000 msgs/sec | 4,015,923 msgs/sec (~490 MiB/s) | ~1.0 us | ### Multi-Publisher / Multi-Subscriber (N:M) | Config | Payload | Pub Aggregate | Sub Aggregate | Pub Latency | Sub Latency | |--------|---------|---------------|---------------|-------------|-------------| | 4P x 4S | 128 B | 1,080,144 msgs/sec (~132 MiB/s) | 4,323,201 msgs/sec (~528 MiB/s) | 3.7 us | 0.93 us | --- ## Core NATS — Request/Reply Latency | Config | Payload | Throughput | Avg Latency | |--------|---------|------------|-------------| | 1 client, 1 service | 128 B | 19,659 msgs/sec | 50.9 us | | 50 clients, 2 services | 16 B | 132,438 msgs/sec | ~370 us | --- ## Core NATS — Tail Latency Under Load From the Brave New Geek latency benchmarks (loopback, request/reply): | Payload | Rate | p99.99 | p99.9999 | Notes | |---------|------|--------|----------|-------| | 256 B | 3,000 req/s | sub-ms | sub-ms | Minimal load | | 1 KB | 3,000 req/s | sub-ms | ~1.2 ms | | | 5 KB | 2,000 req/s | sub-ms | ~1.2 ms | | | 1 KB | 20,000 req/s (25 conns) | elevated | ~90 ms | Concurrent load | | 1 MB | 100 req/s | ~214 ms | — | Large payload tail | A protocol parser optimization improved 5 KB latencies by ~30% and 1 MB latencies by ~90% up to p90. --- ## JetStream — Publication | Mode | Payload | Storage | Throughput | Latency | |------|---------|---------|------------|---------| | Synchronous | 16 B | Memory | 35,734 msgs/sec (~558 KiB/s) | 28.0 us | | Batch (1000 msgs) | 16 B | Memory | 627,430 msgs/sec (~9.6 MiB/s) | 1.6 us | | Async | 128 B | File | 403,828 msgs/sec (~49 MiB/s) | 2.5 us | --- ## JetStream — Consumption | Mode | Clients | Throughput | Latency | |------|---------|------------|---------| | Ordered ephemeral consumer | 1 | 1,201,540 msgs/sec (~147 MiB/s) | 0.83 us | | Durable consumer (callback) | 4 | 290,438 msgs/sec (~36 MiB/s) | 13.7 us | | Durable consumer fetch (no ack) | 2 | 1,128,932 msgs/sec (~138 MiB/s) | 1.76 us | | Direct sync get | 1 | 33,244 msgs/sec (~4.1 MiB/s) | 30.1 us | | Batched get | 2 | 1,000,898 msgs/sec (~122 MiB/s) | — | --- ## JetStream — Key-Value Store | Operation | Clients | Payload | Throughput | Latency | |-----------|---------|---------|------------|---------| | Sync put | 1 | 128 B | 30,067 msgs/sec (~3.7 MiB/s) | 33.3 us | | Get (randomized keys) | 16 | 128 B | 102,844 msgs/sec (~13 MiB/s) | ~153 us | --- ## Resource Usage | Scenario | RSS Memory | |----------|------------| | Core NATS at 2M msgs/sec (1 pub + 1 sub) | ~11 MB | | JetStream production (recommended minimum) | 4 CPU cores, 8 GiB RAM | --- ## Sources - [NATS Bench — Official Docs](https://docs.nats.io/using-nats/nats-tools/nats_cli/natsbench) - [NATS Latency Test Framework](https://github.com/nats-io/latency-tests) - [Benchmarking Message Queue Latency — Brave New Geek](https://bravenewgeek.com/benchmarking-message-queue-latency/) - [NATS CLI Benchmark Blog](https://nats.io/blog/cli-benchmark/)