您好,登錄后才能下訂單哦!
這篇文章主要介紹RocketMQ架構是怎么樣的,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
RocketMQ是開源的一個分布式消息中間件。在RocketMQ中包含四個主要角色:nameserver,元數據管理服務;broker,接收、存儲、分發消息;producer,消息生產者;consumer,消息消費者。整體架構如下圖
Nameserver是一個無狀態的服務,各個nameserver之間無數據交互。每個borker都會向所有nameserver保持心跳消息,將broker上的topic存儲信息上報到nameserver。producer/consumer會隨機選擇一個nameserver建立長鏈接,從nameserver定時拉取訂閱的topic的路由信息。
Broker是消息存儲服務器,一個broker可以包含一個master以及多個slave,master和slave之間形成主備關系。master之間無任何通訊,也就是說rocketmq不會在master之間自動重新分配topic的存儲。一個topic可以存儲在多個broker上,每個broker上又可以分成多個queue,以降低讀寫的壓力。topic的存儲如下圖所示,其中topic和broker之間的對應關系是需要管理員人為指定的。producer和consumer會和訂閱的topic所在的broker建立長鏈接,用于拉取和消費消息。
Producer是消息生產者,多個發送同種消息的producer可以歸到同一個producer group。
Consumer是消息消費者,rocketmq存在兩種消息消費方式:廣播,同一個消息會發送給所有消費者;集群,同一個消息只會發送給一個消費者。同一個類型的消費者可以組成一個consumer group.
Message代表一個消息,一個message有兩個標識的id:msgid & offsetMsgId:
msgId是producer生成的,全局唯一,也叫做uniqId。存儲在Message.properties里,存儲的key是“UNIQ_KEY”。
offsetMsgId,是由存儲的broker的服務器地址以及commitlog的offet兩者拼接而成的。存儲在MessageExt.msgId中。
除了msgid & offsetMsgId之外,消息還可以指定一組keys。broker會把message的keys解析,存儲到一個索引服務(IndexService)當中,支持按key來搜索消息。
RocketMQ的message還支持tag,可以在發送消息時指定tag,并按tag進行訂閱。broker會把消息的tag計算成一個hashcode,存儲到ConsumeQueue當中,這樣在訂閱時就可以快速過濾出包含特定tag的消息。
為了支持消息的快速寫入、讀取、按key搜索、按tag訂閱,rocketmq的消息存儲采用如下架構:
commitlog用來存儲消息原文,不分topic,按順序append到末尾。對于每個消息有一個對應的offset,代表在commitlog中的偏移量。
ConsumeQueue按topic存儲,每個element是固定的20字節的長度,包含一個消息的offset + size + taghashcode。
IndexFile存儲消息的key索引,同一個broker上的所有topic共享同一個index服務。indexservice當中會以“topic#key”的形式來存儲消息基于key的反向索引。
以上是“RocketMQ架構是怎么樣的”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。