上圖是之間討論確定的系統架構(后續內容會按照這個架構來敘述),其中:
-
客戶端包含Producer和Consumer兩大塊
-
客戶端需要和NameServer交互來獲取元數據
-
客戶端需要和Broker交互來讀寫消息
Client模塊劃分
1. 網絡模塊
第一個仍然是網絡模塊。Client需要獲取元數據,需要讀寫消息,網絡模塊是必不可少的。 和Broker不同的是,Client的網絡模塊要簡單一些。Broker需要向NameServer匯報數據,同時還要處理來自Client的請求,而Client更多的只是發出請求:
-
向NameServer獲取元數據
-
向Broker寫入消息
-
從Broker獲取消息
2. 編解碼模塊
Client需要將消息寫到Broker,同時也需要從Broker獲取消息,這兩個過程會涉及到消息的編解碼。
3. 元數據相關
Client相關的元數據有Topic、消費進度、Group(之前介紹過的概念,可以看之前的文章),另外還需要感知其他的客戶端的存在(叫Member信息或者Client Instance信息吧),所以需要Member數據。那么元數據相關大概是以下組件:
-
TopicManager
-
PositionManager
-
GroupManager
-
MemberManager
4. 發送相關
Producer API
對于Client而言,很重要的一個模塊就是暴露出去的發送和消費的API,這是使用方唯一能接觸到的地方(寫代碼時,任何暴露出去的API已經要謹慎謹慎再謹慎)。
對于發送的API,從不同的角度可以分為:
-
從發送方式上有同步發送和異步發送
-
從發送消息量上有單條發送和批量發送
路由模塊
對于發送而言,一條消息最終需要落到某一個確定的分區上。所以客戶端會包含一個路由模塊來根據消息的屬性和Topic的元信息來選擇分區。
5. 消費相關
Consumer API
消費相關的API會比發送的復雜一些,因為消費需要提供更多的模式。另外為了保證順序性、減少消息的重復等,消費還需要引入租約等組件。租約和Consumer的各種模式已經是比較細節的問題了,在設計階段在進行介紹。
分區分配模塊
發送方需要選擇將消息寫入到哪個分區,而消費方需要決定自己消費哪些分區,所以對應于發送方的路由模塊,消費方會有分區分配的模塊。
緩存模塊
為了保證性能,Consumer從Broker獲取消息和使用方消費消息是異步的,中間需要Buffer來緩存消息,所以Consumer相對于Producer會多一個緩存模塊。
除了以上模塊,還會有LifeCycle這樣生命周期相關的基礎模塊,這個也是上一篇在介紹Broker模塊時遺漏的。
總結以上內容,Client包含的模塊大概如下:
?
結語
本篇主要是把Client的幾個模塊劃分出來,為之后的詳細設計做準備。 下一篇會整理一下NameServer的模塊,然后大概會有一到兩篇的篇幅總結一些架構、流程、數據流等。
往期內容:
《什么是分布式消息中間件》
《消息中間件的一些概念》
《業務方對消息中間件的需求》
《消息中間件架構討論》
《Broker模塊劃分》
歡迎關注此公眾號,將堅持不懈的寫MQ相關的技術文章,希望能和更多的朋友交流。