Watermill:用于高效处理消息流的golang库,支持RPC
Watermill 是一个 Go 库,用于高效处理消息流。它旨在 用于构建事件驱动的应用程序,启用事件溯源,通过消息进行 RPC, 支持sagas(一种在分布式系统中处理事务的协议) 以及基本上您想到的其他任何东西。您可以使用传统的发布/订阅 像Kafka或RabbitMQ这样的实现,但如果适合你的用例,也可以使用HTTP或MySQL二进制日志。
目标
- 易于理解。
- 通用 - 事件驱动的体系结构、消息传递、流处理、CQRS - 将其用于您需要的任何用途。
- 快速(请参阅基准测试)。
- 灵活的中间件、插件和发布/订阅配置。
- 弹性 - 使用经过验证的技术并通过压力测试(请参阅稳定性)。
- 官网:Watermill
- 代码: ThreeDotsLabs/watermill: Building event-driven applications the easy way in Go. (github.com)
开始
选择你最喜欢的或按顺序看:
- 按照入门指南进行操作。
- 请参阅以下示例。
- 阅读完整文档:https://watermill.io/
例子
- 基本
- 您的第一个应用程序 - 从这里开始!
- 实时馈送
- 路由器
- 指标
- CQRS 与 protobuf
- 发布/订阅使用
- 这些示例是入门指南的一部分,一次显示单个 Pub/Sub 的使用情况。
- 真实世界的例子
- 完成项目
背景
构建分布式和可扩展的服务很少像某些人建议的那样容易。有一个 编写此类系统带来的许多隐藏知识。就像你不需要知道 整个TCP堆栈来创建HTTP REST服务器,您不需要研究所有这些知识 从构建消息驱动的应用程序开始。
Watermill的目标是使与消息的通信像HTTP路由器一样易于使用。它提供 开始使用事件驱动架构所需的工具,并允许您了解详细信息 忙得不可开交。
在水车的核心有一个简单的界面:
func(*Message) ([]*Message, error)
您的处理程序收到一条消息,并决定是发布新消息还是返回 一个错误。接下来会发生什么取决于您选择的中间件。
您可以在我们的介绍水车博客文章中找到有关我们动机的更多信息。
发布/订阅
所有发布者和订阅者都必须实现一个接口:
type Publisher interface { Publish(topic string, messages ...*Message) error Close() error } type Subscriber interface { Subscribe(ctx context.Context, topic string) (<-chan *Message, error) Close() error }
支持的发布/订阅:
- AMQP 发布/订阅 (
github.com/ThreeDotsLabs/watermill-amqp/v2
) - 螺栓发布/订阅 (
github.com/ThreeDotsLabs/watermill-bolt
) - 菲利姆酒吧/订阅 (
github.com/ThreeDotsLabs/watermill-firestore
) - Google Cloud Pub/Sub (
github.com/ThreeDotsLabs/watermill-googlecloud
) - HTTP Pub/Sub (
github.com/ThreeDotsLabs/watermill-http
) - 哎呀。读者/io。作家出版/订阅 (
github.com/ThreeDotsLabs/watermill-io
) - 卡夫卡酒吧/潜艇 (
github.com/ThreeDotsLabs/watermill-kafka/v2
) - 国家航空出版/订阅 (
github.com/ThreeDotsLabs/watermill-nats
) - Redis Stream Pub/Sub (
github.com/ThreeDotsLabs/watermill-redisstream
) - SQL 发布/订阅 (
github.com/ThreeDotsLabs/watermill-sql/v2
)
所有发布/订阅实现文档都可以在文档中找到。
非官方库
找不到您喜欢的发布/订阅或库集成?检查真棒水车。
如果您知道另一个库或是一个图书馆的作者,请将其添加到列表中。
贡献
请查看 Watermill 的贡献指南。
稳定性
Watermill v1.0.0 已发布,可用于生产。公共 API 是稳定的,如果不更改主要版本,就不会更改。
为了确保所有 Pub/Sub 在生产中稳定且安全使用,我们创建了一组测试,在合并到 master 之前,每个实现都需要通过这些测试。 所有测试也在压力模式下执行 - 这意味着我们将并行运行所有测试20倍。
所有测试都在启用争用条件检测器的情况下运行(测试中的标志)。-race
有关调试测试的详细信息,应查看测试故障排除指南。
基准测试结果
用于对 Pub/Subs 进行基准测试的初始工具可以在水车基准测试中找到。
所有基准测试都在单个 16 CPU VM 实例上完成,在 Docker Compose 中运行一个二进制文件和依赖项。
这些数字旨在粗略估计不同发布/订阅消息处理速度。 请记住,结果可能会有很大不同,具体取决于设置和配置(低得多和更高)。
下面是消息大小为 16 字节的简短版本。
发布/订阅 | 发布(消息/秒) | 订阅(消息/秒) |
---|---|---|
卡夫卡(单节点) | 63,506 | 110,811 |
卡夫卡(5 节点) | 70,252 | 117,529 |
纳特斯 | 76,208 | 38,169 |
SQL (MySQL) | 7,299 | 154 |
SQL (PostgreSQL) | 4,142 | 98 |
谷歌云发布/订阅 | 7,416 | 39,591 |
阿姆克普 | 2,408 | 10,608 |
去频道 | 272,938 | 101,371 |
支持
如果您在文档中没有找到问题的答案,请随时直接询问我们!
请加入Watermill 的Discord 频道 Three Dots Labs Discord。 频道号
#watermill
每一点反馈都非常欢迎和赞赏。请使用调查提交。
为什么叫这个名字?
它处理流!
许可证
MIT