為什麼日誌型訊息佇列效能這麼高?

明明是使用硬碟儲存訊息,效能卻勝過傳統的 In-Memory MQ

Fred Chien(錢逢祥)
Brobridge - 寬橋微服務
3 min readJun 6, 2020

--

Photo by Erlend Ekseth on Unsplash

在協助客戶導入微服務或是事件驅動架構(EDA, Event-Driven Architecture)時,常常有客戶問:

現在的 Log-based MQ 會不會比傳統 In-Memory MQ 慢?

通常會有這樣的質疑,是因為 Log-based MQ (日誌型訊息佇列)都會把訊息寫入到硬碟中,而直覺概念上硬碟速度一定比記憶體慢。但這是真的嗎?

關鍵在於有序存取和隨機存取

針對這一點,根據 ACM Queue 上文章「The Pathologies of Big Data」的實驗結果,其實有序性的硬碟資料存取(Sequential disk access)比隨機記憶體存取(Random memory access)來得快,即使不是 SSD 也是如此(當然實驗中是以 8 個 15,000-RPM SAS 硬碟組成的 RAID 5 來做測試)。

原圖出自:The Pathologies of Big Data

所以,除非舊式 MQ 的設計是堅持以有序性的形式在記憶體上保存訊息,不然速度不一定比 Log-Based MQ 來得快。這也是為什麼像是原本已經是效能領頭羊的 RabbitMQ,效能仍輸給 Kafka(現代日誌型訊息佇列的代表)一大截。

大資料量或特殊需求導致傳統 MQ 效能快速下降

即便傳統 In-Memory MQ 採用了記憶體來保存或管理資料,在資料量大到一定程度或有 durable 的需求時 ,傳統的 MQ 仍然會開始藉助硬碟來存放資料(例如 swap 或是實際的 persistent storage),這無疑會導致 In-Memory MQ 性能下降。

要知道,使用記憶體時若不能維持有序性存取,再加上隨機的硬碟存取,效能理所當然會被衝擊。因此,即使主要使用記憶體來維護訊息資料,也不一定比一開始就設計採用有序性硬碟 I/O(sequential disk I/O)加速的 MQ 來得快。

日誌型訊息佇列仍然可以有記憶體快取機制

Log-based MQ 仍然還是可以有 In-memory cache 的設計,以進一步提升效能。這讓 Log-based MQ 能在速度和實用性上,取得一定的平衡,也能實作傳統射後不理的 MQ 所不能做的事(例如:訊息回放)。

日誌型訊息佇列仍然沒有大獲全勝

不過要注意的是,這樣的情況也只是相較於過去的 MQ 設計來說而已,近年來一些新的 In-Memory MQ(如:NATS),都考量過這些問題,在效能上還是遠超過 Log-based MQ。

總體來說,對於許多正準備引入新技術的客戶,拿 Log-based MQ 跟傳統商業 MQ 或 RabbitMQ 做比較,因為舊式 MQ 沒有考慮有序性的資料存取問題,所以 Log-based MQ 的效能通常還是更勝一籌。以功能面來說,Log-based MQ 還可以保留事件訊息的過往紀錄,在實務用途上相對可靠。這也是進入到 Big Data 時代或是微服務時代後,Kafka 這類 MQ 變成主流的原因。

--

--