Liking cljdoc? Tell your friends :D

Raw streaming capacity tables — 2026-08-30

Backing data for the streaming results in ../soak-results.md. Setup: 1-CPU/1-Gi grpc-jvm pod, driver (clj-grpc.soak.stream-driver) on its own worker, persistent bidi Chat streams, absolute-schedule open-loop pacing, bounded in-flight (256/stream), per-message client-side latency. First step of every run is JIT warmup (fresh pods) — excluded from conclusions.

Summary

Streaming capacity (2026-08-30, bidi Chat echo, same grpc-jvm pod, raw tables in results/): streaming moves ~15,000–16,000 msg/s on one core — ~7.5× the unary gRPC plateau and ~16× REST — with per-message p50 under 2 ms and p99 under 30 ms through 8,000 msg/s. The executors split decisively at streaming's limits: :executor :direct holds p99 2–2.5× lower than the VT default at every rate above 6,000 and keeps delivering at 16,000 (38 deferred/s vs VT's 625/s) — the per-message dispatch the VT executor still pays is the one cost streaming cannot amortize. Full doctrine across every measured regime: VT wins only low-utilization unary tails; :direct wins high-load unary, all streaming, capacity, and CPU — provided handlers never block. And the library's oldest guidance is now cluster-quantified: one stream really does beat N unaries, by ~7.5× per core.

S1 — VT executor, 20 streams, 400–4,800 msg/s

offered msg/ssent/sechoed/sp50msp99msp999msdeferred/s
400400.0400.03.342460.292460.290.0
800800.0800.02.478.2214.970.0
12001200.21200.22.478.2214.970.0
16001600.01600.02.478.2220.210.0
20002000.02000.01.838.2220.210.0
24002400.22400.21.838.2214.970.0
28002800.22800.21.838.2227.290.0
32003200.03200.01.838.2214.970.0
36003600.23600.21.8311.0927.290.0
40004000.04000.01.838.2214.970.0
44004400.24400.21.8311.0920.210.0
48004800.24800.21.8311.0927.290.0

S2 — :direct, 20 streams, 400–4,800 msg/s

offered msg/ssent/sechoed/sp50msp99msp999msdeferred/s
400400.0400.03.341822.432460.290.0
800800.0800.02.4711.09122.360.0
12001200.21200.22.478.2214.970.0
16001600.01600.01.838.2211.090.0
20002000.02000.01.838.2214.970.0
24002400.22400.22.478.2214.970.0
28002800.22800.21.838.2220.210.0
32003200.03200.01.368.2220.210.0
36003600.23600.21.8311.0949.730.0
40004000.04000.01.838.2214.970.0
44004400.24400.21.8311.0920.210.0
48004800.24800.21.8311.0927.290.0

E1 — VT executor, 40 streams, 4,000–16,000 msg/s

offered msg/ssent/sechoed/sp50msp99msp999msdeferred/s
40003154.93154.94.5120105.8320105.83845.1
60006000.36000.32.4727.2967.140.0
80008000.08000.03.3427.2967.140.0
1000010000.010000.04.5190.64122.360.0
1200012000.312000.34.51165.19301.060.0
1400014000.314000.311.09406.43406.430.0
1600015375.115375.127.291349.952460.29625.0

E2 — :direct, 40 streams, 4,000–16,000 msg/s

offered msg/ssent/sechoed/sp50msp99msp999msdeferred/s
40003641.03641.02.4714893.2114893.21359.0
60006000.36000.31.8314.9727.290.0
80008000.08000.02.4720.2190.640.0
1000010000.010000.03.3449.73122.360.0
1200012000.312000.33.3467.14122.360.0
1400014000.314000.34.51165.19301.060.0
1600015961.715961.711.09740.71740.7138.3

Can you improve this documentation?Edit on GitHub

cljdoc builds & hosts documentation for Clojure/Script libraries

Keyboard shortcuts
Ctrl+kJump to recent docs
Move to previous article
Move to next article
Ctrl+/Jump to the search field
× close