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 的並行能力。這種組合允許編寫高度高效且類型安全(type-safe)的代碼,並能編譯成原生二進位檔,從而最大限度地減少運行時開銷。

"令人印象深刻的基準測試。在 2 vCPU 的實例上達到 1M msgs/sec 是對 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 是一個強力的競爭者。創作者們邀請社群來探索他們的解決方案,並分享關於目前訊息處理實踐以及會影響切換到新代理的因素之見解。

Sources