Fan-in is the many-to-few case: a large number of publishers, each on its own topic, feeding a small pool of subscribers that share the load through a shared subscription. Every message is delivered to exactly one subscriber, so the broker does no delivery amplification — what this measures is ingest at scale plus the cost of dispatching across a shared subscription group.
50,000 publishers on 50,000 topics at one message per second, so 50,000 messages/second in aggregate, consumed by 500 subscribers sharing $share/benchmark/test/#. QoS 1, 16-byte payload, 30 minutes. The scenario mirrors the Open MQTT Benchmark Suite's singlenode-sharesub-50K-500-50K-50K case so the figures can be read against those published there; see the Test Environment page for hardware, tuning and method.
Server
Version
Messages
Achieved rate
Avg latency
CPU
Peak RAM
EMQX 5.8.9
5.8.9
75,524,828
41,958/s(below target)
103s
1323% mean / 1649% peak
9.78 Gb
Mosquitto 2.0.22-5build1
2.0.22-5build1
89,967,834
49,982/s
379.4ms
100% mean / 101% peak
31.4 Gb
XMQ 0.9.18
0.9.18
89,999,801
49,999/s
202us
223% mean / 237% peak
292 Mb
FlashMQ 1.27.1
1.27.1
89,999,814
49,999/s
198us
217% mean / 226% peak
245 Mb
EMQX 5.8.9
Mosquitto 2.0.22-5build1
XMQ 0.9.18
FlashMQ 1.27.1
Latency uses a logarithmic axis: the brokers differ by several orders of magnitude in this scenario, and a linear axis would flatten the faster ones onto the baseline. Hover the chart for per-interval values.
Reading the results
XMQ and FlashMQ both hold the full rate, close together: XMQ at 202 µs, FlashMQ at 198 µs, both flat across the whole thirty minutes and both unpinned, on 223% and 217% of a core respectively.
Mosquitto also holds the rate, at 379 ms, and is the one overloaded case here whose latency improves over the run rather than diverging (946 ms down to 145 ms), on a single core. The cost is memory: 31.4 GB peak on a 40 GB host. This configuration leaves the in-flight and queued message limits unbounded, so the early backlog is absorbed as heap rather than as dropped messages.
EMQX is not re-verified this round, and its figure here needs a caveat rather than a repeat. The number below (5.8.9) did not reach the offered rate: 41,958/s of 50,000/s, latency climbing from 226 ms to 260 s while saturating all 16 vCPUs, against EMQX's own published 50,000/s at 2.51 ms for this scenario. Mosquitto held the same rate on a single core in the same run, which points at something specific to shared-subscription dispatch rather than a simple capacity limit. The same shape reappeared, worse, on EMQX 6.3.1 in a later round under this harness; that round's numbers are held pending a review of our shared-subscription configuration against EMQX's own published benchmark, and this page will be updated once that is settled.
If you have any questions or comments regarding this page feel free to drop a line to Alexey Parshin. Design by Michael Perlov.