摘要:和之間的關(guān)系通過(guò)來(lái)綁定,來(lái)定義,即相同的,等于表示節(jié)點(diǎn),非表示節(jié)點(diǎn)。所有的節(jié)點(diǎn)與集群的所有節(jié)點(diǎn)保持長(zhǎng)連接,定時(shí)注冊(cè)信息到所有的。對(duì)磁盤的訪問(wèn)串行化,避免磁盤竟?fàn)?,不?huì)因?yàn)殛?duì)列增加導(dǎo)致增高。要保證與完全的一致,增加了編程的復(fù)雜度。
Apache RocketMQ?是一個(gè)開(kāi)源的分布式消息和流數(shù)據(jù)平臺(tái)。
1、既然是消息系統(tǒng),最核心的功能就是要提供消息的發(fā)布與訂閱功能,最簡(jiǎn)單的概念模型如下:
但是rocketmq提供的能力會(huì)比這個(gè)復(fù)雜的多,如一個(gè)生產(chǎn)方發(fā)布消息,需要多個(gè)消費(fèi)方訂閱,也會(huì)存在多個(gè)生產(chǎn)方生產(chǎn)消息,一個(gè)消費(fèi)方消費(fèi)消息,出現(xiàn)一對(duì)多,多對(duì)一的情況。
上圖就是擴(kuò)展了producer、consumer和Topic的概念模型,rocketmq最核心的概念就是Tpoic,producer和consumer都是圍繞Topic展開(kāi),每個(gè)broker下可以有多個(gè)topic,topic下又可以有很對(duì)隊(duì)列messageQueue,相同的topic又可以分布在不同broker節(jié)點(diǎn)下,producer發(fā)送消息會(huì)輪訓(xùn)的發(fā)送到topic的隊(duì)列下;相同consumer分組是負(fù)載均衡訂閱消息,不同的consumer分組之間互不干擾,即使廣播訂閱消息;同一Topic下的每個(gè)隊(duì)列只能被相同分組下的一個(gè)consumer訂閱消費(fèi),但一個(gè)consumer可以消費(fèi)多個(gè)隊(duì)列。
2、整體部署架構(gòu)圖
nameserver是幾乎沒(méi)有狀態(tài)的節(jié)點(diǎn),可以集群部署,節(jié)點(diǎn)之間也沒(méi)有任何數(shù)據(jù)同步。
broker的部署相對(duì)復(fù)雜,是一個(gè)數(shù)據(jù)分散集群,分master和slave,每個(gè)master存儲(chǔ)一部分?jǐn)?shù)據(jù),為了數(shù)據(jù)的高可用,每個(gè)master節(jié)點(diǎn)可以有多個(gè)slave節(jié)點(diǎn),master之間無(wú)數(shù)據(jù)同步,master與slave之間有數(shù)據(jù)同步。master和slave之間的關(guān)系通過(guò)brokerName來(lái)綁定,brokerId來(lái)定義,即相同的brokerName,brokerId等于0表示master節(jié)點(diǎn),非0表示slave節(jié)點(diǎn)。所有的broker節(jié)點(diǎn)與nameserver集群的所有節(jié)點(diǎn)保持長(zhǎng)連接,定時(shí)注冊(cè)Topic信息到所有的nameserver。
producer與nameserver集群中的一臺(tái)(隨機(jī))保持長(zhǎng)連接,定時(shí)獲取Topic路由信息,并且與提供Topic服務(wù)的broker的master節(jié)點(diǎn)保持長(zhǎng)連接,并定時(shí)發(fā)送心跳,producer集群也是無(wú)狀態(tài)的,可以集群部署。
consumer與nameserver集群中的一臺(tái)(隨機(jī))保持長(zhǎng)連接,定時(shí)獲取Topic路由信息,并且向提供Topic的broker的master和slave節(jié)點(diǎn)都保持長(zhǎng)連接,并定時(shí)發(fā)送心跳,Consumer既可以從 Master 訂閱消息,也可以從 Slave 訂閱消息,訂閱規(guī)則由 Broker 配置決定,consumer也是集群的部署的,負(fù)載均衡的消費(fèi)Topic的消息。
3、消息的存儲(chǔ)模型
rocketmq的消息存儲(chǔ)與消費(fèi)隊(duì)列是分開(kāi)的,消息被存儲(chǔ)在commitLog下,然后再異步構(gòu)建消費(fèi)隊(duì)列messageQueue,消費(fèi)隊(duì)列并不存儲(chǔ)真正的消息內(nèi)容,只是存儲(chǔ)消息在commitLog下的偏移量、消息的長(zhǎng)度和消息的tag的hashcode。如圖所示:
所有數(shù)據(jù)多帶帶存儲(chǔ)到一個(gè) Commit Log,完全順序?qū)?,隨機(jī)讀。
對(duì)最終用戶展現(xiàn)的隊(duì)列實(shí)際只存儲(chǔ)消息在 Commit Log 的位置信息,并且串行方式刷盤。
這樣設(shè)計(jì)有以下優(yōu)勢(shì):
隊(duì)列輕量化,單個(gè)隊(duì)列數(shù)據(jù)量非常少。
對(duì)磁盤的訪問(wèn)串行化,避免磁盤竟?fàn)?,不?huì)因?yàn)殛?duì)列增加導(dǎo)致 IOWAIT 增高。
但也存在以下缺點(diǎn):
寫(xiě)雖然完全是順序?qū)?,但是讀卻變成了完全的隨機(jī)讀。
讀一條消息,會(huì)先讀 Consume Queue,再讀 Commit Log,增加了開(kāi)銷。
要保證 Commit Log 與 Consume Queue 完全的一致,增加了編程的復(fù)雜度。
4、rocketmq具有以下特點(diǎn)
能夠保證嚴(yán)格的消息順序
提供豐富的消息拉取模式
高效的訂閱者水平擴(kuò)展能力
實(shí)時(shí)的消息訂閱機(jī)制
億級(jí)消息堆積能力
與其他消息隊(duì)列系統(tǒng)的一個(gè)對(duì)比如下:
消息產(chǎn)品 | 支持客戶端 | 協(xié)議和規(guī)范 | 順序消息 | 定時(shí)消息 | 批量消息 | 廣播消息 | 消息過(guò)濾 | 消息回溯 | 消息優(yōu)先級(jí) | 高可用和故障切換 | 消息追蹤 | 配置 | 管理和操作工具 | Server Triggered Redelivery | 消息存儲(chǔ) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ActiveMQ | java,c++,php,net | 推模型,支持 OpenWire, STOMP, AMQP, MQTT, JMS | 獨(dú)占消費(fèi)和消息分組支持順序 | 支持 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持,leveldb+zookeeper | 不支持 | 默認(rèn)配置是低級(jí)別的,用戶需要優(yōu)化配置參數(shù) | 支持 | 不支持 | 支持JDBC,leveldb,kahadb |
Kafka | java,scala | 拉模型, 支持TCP | 分區(qū)內(nèi)消息有順序 | 不支持 | 支持異步生產(chǎn)者 | 不支持 | 支持 | 支持 | 不支持 | 支持,依賴zookeeper | 不支持 | Kafka使用鍵值對(duì)格式進(jìn)行配置。這些值可以通過(guò)文件提供,也可以通過(guò)編程方式提供 | 支持,使用命令行 | 不支持 | 高性能文件存儲(chǔ) |
RocketMQ | java,c++,go | 拉模型, 支持TCP, JMS, OpenMessaging | 確保消息的嚴(yán)格順序,并可以優(yōu)雅地?cái)U(kuò)展 | 支持 | 支持同步模式,以避免消息丟失 | 支持 | 支持 | 支持按時(shí)間和偏移量 | 不支持 | 支持主從模式 | 支持 | 開(kāi)箱即用,用戶只需注意一些配置 | 支持,命令行和web客戶端 | 支持 | 高性能和低延遲的文件存儲(chǔ) |
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77214.html
摘要:每個(gè)記錄完整的路由信息,提供相應(yīng)的讀寫(xiě)服務(wù),并支持快速存儲(chǔ)擴(kuò)展。此外,提供災(zāi)難恢復(fù),豐富的指標(biāo)統(tǒng)計(jì)數(shù)據(jù)和警報(bào)機(jī)制,而傳統(tǒng)的消息傳遞系統(tǒng)都缺乏這些機(jī)制。發(fā)送過(guò)程支持并具有低延遲。 概覽 Apache RocketMQ是一款具有低延遲,高性能和可靠性,數(shù)十億容量和靈活可擴(kuò)展性的分布式消息傳遞和流媒體平臺(tái)。它由四部分組成:Name Servers,brokers,producers和cons...
摘要:通過(guò)以上分析我們可以得出消息隊(duì)列具有很好的削峰作用的功能即通過(guò)異步處理,將短時(shí)間高并發(fā)產(chǎn)生的事務(wù)消息存儲(chǔ)在消息隊(duì)列中,從而削平高峰期的并發(fā)事務(wù)。 該文已加入開(kāi)源項(xiàng)目:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)的文檔類項(xiàng)目,Star 數(shù)接近 16k)。地址:https://github.com/Snailclimb... 本文內(nèi)容思維導(dǎo)圖:showImg(ht...
摘要:最近對(duì)基礎(chǔ)教程系列的催更比較多,說(shuō)一下最近的近況因?yàn)榇蛩阋黄鸶隆T俅?,?duì)于中國(guó)用戶來(lái)說(shuō),還有一個(gè)非常特殊的意義它將曾經(jīng)紅極一時(shí)的,以及阿里巴巴的強(qiáng)力消息中間件融入體系。 最近對(duì)《Spring Cloud Alibaba基礎(chǔ)教程》系列的催更比較多,說(shuō)一下最近的近況:因?yàn)榇蛩鉙pring Boot 2.x一起更新。所以一直在改博客Spring Boot專題頁(yè)和Git倉(cāng)庫(kù)的組織。由于前端技...
閱讀 3613·2021-09-13 10:28
閱讀 1964·2021-08-10 09:43
閱讀 1035·2019-08-30 15:44
閱讀 3213·2019-08-30 13:14
閱讀 1875·2019-08-29 16:56
閱讀 2968·2019-08-29 16:35
閱讀 2873·2019-08-29 12:58
閱讀 893·2019-08-26 13:46