這幾天針對高性能,強順序的MQ產品進行了測試和選型,主要針對的是apache kafka和apache rocketmq 兩款產品。
對兩端產品的特性做一個簡單的闡述:
rocketmq 是國內阿里巴巴出產,來自大廠,聽說經過雙十一洗禮,穩定可靠,主要針對電商場景,支持事務消息,支持延遲消息(用於付款),支持多副本(高可用),消息嚴格有序,性能測試與kafka不相上下,異步刷盤和同步刷盤,消息持久化。每個topic下都有讀/取 隊列劃分,可以路由消息到指定隊列,這一點和kafka的消息分區概念接近。
kafka 出自國際大廠 linkin, 目前主要創始人目前自立門戶創辦了公司 confluent並且推出開源的平臺和組件,穩定可靠,上手部署快。各種大廠都在用,用戶羣體廣,穩定可靠,但是有些問題。其支持的特性是 異步刷盤、0.10版本開始支持事務消息和流處理,支持多副本,要嚴重依賴zookeeper實現副本集羣和leader、follower切換,支持topic分區。
不支持 延遲消息隊列(要靠自己實現),因消費通過offset進行確認的機制,導致消息卡頓和消息重複消費。
kafka 的事務消息與 rocketmq 實現方式有差異,kafka 的事務可以跨分區並且有回滾操作,而rocketmq 採用2PC 強一致的方式進行。
kafka 會在生產者與broker兩端可能丟失部分消息,kafka的生產者將累計消息發送,而不是一條消息就發送一次,所以當消息沒有達到發送閾值生產者又異常退出,則消息丟失。
kafka 和rmq都是用的page cache,而不是堆內存,所以應用退出後操作系統會保證數據寫回磁盤。
rocketmq 主要針對的是topic 數據,而kafka 則已經擴展至stream.
rocketmq 對每一條消息都要設置key與tag ,沒有Key與tag的消息容易出現不可預期的問題。
rocketmq consumer 有兩種方式,一種是pull consumer,一種是push consumer
pull 爲主動拉取,可以拉取指定offset和message queue 的消息, 適合補充消費。Pull模式爲嚴格排序方式。
push 爲被動推,又可分爲多線程亂序方式與嚴格排序方式,嚴格排序方式無論多少線程,都會變成單線程模式。