// the find
ThreeDotsLabs/watermill
Building event-driven applications the easy way in Go.
Watermill is a Go message-passing library that wraps Kafka, RabbitMQ, NATS, Redis Streams, SQL, and others behind a single Publisher/Subscriber interface. It's aimed at Go teams who want to build event-driven services without writing their own broker adapters or retry/middleware scaffolding. The CQRS and saga components are genuinely useful additions on top of the core pub/sub abstraction.
The core abstraction is honest about what it is — a thin, consistent interface over very different brokers, not a magic unification layer. The middleware chain (retry, poison queue, throttle, metrics) composes cleanly and doesn't require touching handler code. The SQL pub/sub backend is underrated: teams already running Postgres can get reliable messaging without standing up a separate broker, and the transactional events example shows exactly when this matters. Stress tests run 20x in parallel with -race enabled — that's a real signal, not just CI theater.
Each Pub/Sub lives in a separate module with its own go.mod, which means version drift between adapters is your problem to manage — there's no lockstep release guarantee. The CQRS component forces a specific marshaling approach (protobuf or JSON) and the command/event processor configuration is verbose enough that you'll copy-paste from examples rather than understand it from the API. The SQL subscriber uses polling, not LISTEN/NOTIFY, so sub-second latency on Postgres requires tuning the poll interval and accepting unnecessary load. Documentation lives on watermill.io but the repo itself has no runnable integration tests you can spin up locally without Docker Compose, which slows onboarding on constrained environments.