explaingit

iwetan77/flume

2GoAudience · developerComplexity · 4/5ActiveLicenseSetup · moderate

TLDR

Go pub-sub broker on QUIC where each subscriber gets its own stream, so a slow consumer cannot block others through head-of-line backpressure.

Mindmap

mindmap
  root((Flume))
    Inputs
      Publish frame
      Subscribe frame
      Topic name
    Outputs
      Per topic stream
      Binary payload
      Backpressure
    Use Cases
      Lossy networks
      IoT fanout
      Low latency pubsub
    Tech Stack
      Go
      QUIC
      Binary protocol

Things people build with this

USE CASE 1

Run a pub-sub broker that holds up on lossy networks where TCP brokers stall

USE CASE 2

Fan out messages to many subscribers without one slow client delaying others

USE CASE 3

Build a low-latency telemetry pipeline using a fixed six-byte header format

USE CASE 4

Benchmark Flume against NATS and Redis under simulated packet loss

Tech stack

GoQUIC

Getting it running

Difficulty · moderate Time to first run · 30min

Needs a Go toolchain that supports QUIC libraries, and TLS certificates since QUIC mandates them.

MIT license, so you can use, modify, and redistribute it freely as long as you keep the copyright notice.

In plain English

Flume is a publish-subscribe message broker written in Go that uses QUIC, the network protocol underneath HTTP/3, as its transport. A broker is the middle process that lets one program send a message on a topic and any number of other programs subscribe to that topic and receive it. The novel thing about Flume is that every subscriber gets its own dedicated QUIC stream. The README spends most of its space explaining the why. Most brokers, including NATS and Redis pub/sub, run on TCP, where all data shares one ordered byte stream per connection. If one subscriber reads slowly, packets pile up and can delay other consumers, a problem called head-of-line blocking. Existing brokers work around it at the application layer by buffering, dropping messages, or disconnecting slow consumers. QUIC, by contrast, supports many independent streams on one connection, each with its own flow control. So in Flume a stalled subscriber only stalls its own stream, and the others keep moving. The flow is straightforward. A client opens a QUIC connection to the broker, opens a control stream, and sends a SUBSCRIBE frame. The broker then opens a new stream back to the client dedicated to that topic, and all messages for that topic travel on that stream only. If the subscriber falls behind, QUIC handles the backpressure on that stream in isolation. The wire format is binary with a fixed six-byte header: one byte for message type, one for topic-name length, four for payload length, then the topic and payload bytes. No JSON, no protobuf. The README includes a localhost benchmark under 10 percent simulated packet loss showing roughly 12 ms p99 latency versus 340 ms for NATS and 410 ms for Redis, attributed to QUIC's per-stream loss recovery. The project is MIT licensed.

Copy-paste prompts

Prompt 1
Build Flume from source and run the broker on localhost with a sample publisher and subscriber
Prompt 2
Write a Go client that opens a control stream and sends a SUBSCRIBE frame for topic prices
Prompt 3
Reproduce the 10 percent packet loss benchmark against NATS and chart p99 latency
Prompt 4
Add a UNSUBSCRIBE frame type to the wire format and handle it on the broker side
Prompt 5
Help me reason about flow control on a per-topic QUIC stream when the subscriber stalls
Open on GitHub → Explain another repo

Generated 2026-05-22 · Model: sonnet-4-6 · Verify against the repo before relying on details.