LavinMQ: 使用 Crystal 构建的高性能、开源消息中间件
消息中间件是现代分布式系统的关键组件,能够实现异步通信并实现服务解耦。然而,传统的中间件有时会消耗大量资源,或者带来难以诊断和解决的操作挑战。LavinMQ 作为一种极具吸引力的开源替代方案脱颖而出,它由经验丰富的 CloudAMQP 团队从零开始设计,旨在解决这些问题,并承诺提供卓越的性能和资源效率。
本文深入探讨了 LavinMQ 的起源、其独特的架构选择以及它所取得的令人印象深刻的基准测试结果,从而洞察使用 Crystal 语言构建的消息中间件如何能够重新定义对吞吐量和操作简便性的预期。
LavinMQ 的诞生:解决现实世界的中间件挑战
LavinMQ 的创建者——CloudAMQP 团队,在托管 RabbitMQ 的过程中积累了 14 年的经验,对消息中间件相关的操作复杂性和痛点有着深刻的见解。LavinMQ 的创建者 Carl Hoerberg 解释说,尽管他们拥有丰富的经验,但客户偶尔会遇到一些难以在现有外部中间件的限制下进行充分解释或规避的问题。
这促使他们做出了一个宏大的决定:构建自己的中间件。这让他们能够完全控制技术栈,并能够在以前无法提供解决方案的地方提供支持。这段旅程始于一个旨在处理短连接以减轻 CPU 剧烈波动的开源 AMQP 代理。最初只是一个协议实现,后来演变成了一个更大的挑战:构建一个可靠的持久化层。虽然协议本身被证明是“简单部分”,但实现稳健的磁盘存储、确认机制(acknowledgment)处理和复制(replication)花费了多年的专注投入。LavinMQ 的第一个版本发布于 2020 年,目前已在 CloudAMQP 上运行超过 5,000 个生产实例。
技术架构与性能实力
LavinMQ 专为速度和效率而设计,通过以下几个关键设计选择脱颖而出:
语言与并发模型
LavinMQ 使用 Crystal 编写,这种语言以类 Ruby 语法结合 LLVM 编译语言的性能优势以及类 Go 的并发能力而闻名。这种组合允许编写高度高效、类型安全的代码,并编译为原生二进制文件,从而最大限度地减少运行时开销。
"令人印象深刻的基准测试。在 2 vCPU 实例上达到 100 万条消息/秒的速率,是 Crystal 的一个绝佳展示。作为 Crystal 核心成员,我一直将 LavinMQ 视为面向性能工程的典范,特别是在它处理 I/O 和最大限度减少系统调用(syscalls)以充分利用硬件方面。如果你想在严肃的生产环境中观察 Crystal 的并发和类型系统,这就是值得关注的项目。向自 2020 年以来一直致力于此工作的 LavinMQ 团队致敬。" — @sdogruyol, Crystal 核心成员
资源优化
其核心设计理念围绕着最大限度地减少内存拷贝、分配和系统调用展开。消息直接通过内存映射文件(memory-mapped files)写入磁盘,绕过内存缓存。消息和确认机制(acknowledgments)都采用追加写(append-only writes)策略,这种策略优化了磁盘 I/O 并简化了崩溃恢复。
支持的协议与部署
LavinMQ 支持一系列必需的消息协议,包括 AMQP 0-9-1、MQTT、HTTP 和 streaming。它以单个二进制文件形式分发,简化了部署。为了进行快速评估,可以通过一个简单的命令使用 Docker 运行:docker run -p 15672:15672 -p 5672:5672 cloudamqp/lavinmq。
基准测试亮点
性能数据证明了其优化的设计:
- ~580,000 messages/second 在 AWS t4g.micro 实例(2 vCPU, 1 GB RAM)上。
- 超过 1,000,000 messages/second 在 AWS c8g.large 实例(2 vCPU, 4 GB RAM)上。
这些数字强调了 LavinMQ 在极低硬件配置下提供高吞吐量的能力,使其成为对成本敏感或高性能环境的极佳选择。
对可靠性与持久性的考虑
对于任何消息中间件,可靠性和消息持久性都是至关重要的。对于评估 LavinMQ 的用户(特别是在分布式和容错设置中)来说,一个关键问题涉及其在 Leader 故障时的行为。具体而言,在集群环境中,发布者确认(publisher confirm)是否能保证消息在至少一个 Follower 节点上存活,这是确保数据完整性和可用性的关键方面。
虽然最初的公告强调了可靠磁盘存储和复制的挑战,但对于潜在采用者来说,进一步了解 LavinMQ 如何处理集群设置中的 Leader 故障场景(特别是关于发布者确认机制),将是非常有价值的。这是需要强持久性保证的系统所关注的共同问题。
结论
LavinMQ 代表了构建高性能、资源高效且操作透明的消息中间件的重大努力。它诞生于托管 RabbitMQ 的多年经验,利用 Crystal 语言和精心优化的架构,在适度硬件上提供令人印象深刻的吞吐量。对于寻求开源消息中间件且希望性能、效率和控制力兼具的组织来说,LavinMQ 是一个强有力的竞争者。创建者们邀请社区探索他们的解决方案,并分享关于当前消息传递实践以及影响切换到新中间件因素的见解。 ",