中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

說說MQ之RocketMQ(一)

2018-10-16    來源:importnew

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用

RocketMQ 是出自 A 公司的開源產(chǎn)品,用 Java 語言實(shí)現(xiàn),在設(shè)計(jì)時(shí)參考了 Kafka,并做出了自己的一些改進(jìn),消息可靠性上比 Kafka 更好,目前,RocketMQ 的文檔仍然不夠豐富?1?2,社區(qū)仍然無法與 Kafka 比肩,但 A 公司已經(jīng)推出了基于 RocketMQ 的云產(chǎn)品?3,相信未來 RocketMQ 也會(huì)有不錯(cuò)的發(fā)展。本文采用 RocketMQ 3.2.6 進(jìn)行實(shí)驗(yàn),由于 RocketMQ 與 Kafka 很相似,本文很多地方對(duì)兩者做出了比較。

基本概念

RocketMQ 由于借鑒了 Kafka 的設(shè)計(jì),包括組件的命名也很多與 Kafka 相似,下面摘抄一段《RocketMQ 原理簡(jiǎn)介》中的介紹,可以與 Kafka 的命名比對(duì)一下,

  • Producer,消息生產(chǎn)者,負(fù)責(zé)產(chǎn)生消息,一般由業(yè)務(wù)系統(tǒng)負(fù)責(zé)產(chǎn)生消息。
  • Consumer,消息消費(fèi)者,負(fù)責(zé)消費(fèi)消息,一般是后臺(tái)系統(tǒng)負(fù)責(zé)異步消費(fèi)。
  • Push Consumer,Consumer 的一種,應(yīng)用通常向 Consumer 對(duì)象注冊(cè)一個(gè) Listener 接口,一旦收到消息,Consumer 對(duì)象立 刻回調(diào) Listener 接口方法。
  • Pull Consumer,Consumer 的一種,應(yīng)用通常主動(dòng)調(diào)用 Consumer 的拉消息方法從 Broker 拉消息,主動(dòng)權(quán)由應(yīng)用控制。
  • Producer Group,一類 Producer 的集合名稱,這類 Producer 通常發(fā)送一類消息,且發(fā)送邏輯一致。
  • Consumer Group,一類 Consumer 的集合名稱,這類 Consumer 通常消費(fèi)一類消息,且消費(fèi)邏輯一致。
  • Broker,消息中轉(zhuǎn)角色,負(fù)責(zé)存儲(chǔ)消息,轉(zhuǎn)發(fā)消息,一般也稱為 Server。在 JMS 規(guī)范中稱為 Provider。

《RocketMQ 原理簡(jiǎn)介》中還介紹了一些其他的概念,例如,廣播消費(fèi)和集群消費(fèi),廣播消費(fèi)是 Consumer Group 中對(duì)于同一條消息每個(gè) Consumer 都消費(fèi),集群消費(fèi)是 Consumer Group 中對(duì)于同一條消息只有一個(gè) Consumer 消費(fèi)。Kafka 采用的是集群消費(fèi),不支持廣播消費(fèi)(好吧,是我沒有找到)。再例如,普通順序消息和嚴(yán)格順序消息,普通順序消息在 Broker 重啟情況下不會(huì)保證消息順序性;嚴(yán)格順序消息即使在異常情況下也會(huì)保證消息的順序性。個(gè)人理解,所謂普通順序消息,應(yīng)該就是 Kafka 中的 Partition 級(jí)別有序,嚴(yán)格順序消息,應(yīng)該是 Topic 級(jí)別有序,但文中也提到,這樣的有序級(jí)別是要付出代價(jià)的,Broker 集群中只要有一臺(tái)機(jī)器不可用,則整個(gè)集群都不可用,降低服務(wù)可用性。使用這種模式,需要依賴同步雙寫,主備自動(dòng)切換,但自動(dòng)切換功能目前還未實(shí)現(xiàn)(我猜,自動(dòng)切換僅僅是沒開源吧)。說白了,嚴(yán)格順序消息不具備生產(chǎn)可用性,自己玩玩還行,其應(yīng)用場(chǎng)景主要是數(shù)據(jù)庫 binlog 同步。

關(guān)于 RocketMQ 和 Kafka 的對(duì)比,可以參考 RocketMQ Wiki 中的文章?4,看看就行,不必較真。

關(guān)于順序和分區(qū)

順序性的話題,剛才已經(jīng)提到了一些,RocketMQ 的實(shí)現(xiàn)應(yīng)該不弱于 Kafka。對(duì)于分區(qū),RocketMQ 似乎有意弱化了這個(gè)概念,只有在 Producer 中有一個(gè)參數(shù)?defaultTopicQueueNums,分區(qū)在 RocketMQ 中有時(shí)被稱為隊(duì)列。RocketMQ 的普通順序消息模式,應(yīng)該就是分區(qū)順序性,這點(diǎn)與 Kafka 一致。

關(guān)于高可用

RocketMQ 實(shí)現(xiàn)高可用的方式有多種,《RocketMQ 用戶指南》文檔中提到的有:多主模式、多主多從異步復(fù)制模式、多主多從同步復(fù)制模式。多主模式下,性能較好,但是在 Broker 宕機(jī)的時(shí)候,該 Broker 上未消費(fèi)的交易不可消費(fèi);多主多從異步復(fù)制模式,與 Kafka 的副本模式比較類似,主 Broker 宕機(jī)后,會(huì)自動(dòng)切換到從 Broker,消息的消費(fèi)不會(huì)出現(xiàn)間斷;多主多從同步復(fù)制模式更進(jìn)一步,采用同步刷盤的方式,避免了主 Broker 宕機(jī)帶來的消息丟失,但是,目前不支持自動(dòng)切換。

雖然 RocketMQ 提供了多種高可用方式,但是目前能生產(chǎn)使用的就只有多主多從異步復(fù)制模式,即使在這個(gè)模式上,其實(shí)現(xiàn)也比 Kafka 要差。因?yàn)?RocketMQ 的機(jī)制中,主從關(guān)系是人為指定的,主 Broker 上承擔(dān)所有的消息派發(fā),而 Kafka 的主從關(guān)系是通過選舉的方式選出來的,每個(gè)分區(qū)的主節(jié)點(diǎn)都是不一樣的,可以從不同的節(jié)點(diǎn)派發(fā)消息。Kafka 的模式是分散模式,有利于負(fù)載均衡,而且當(dāng)一個(gè) Broker 宕機(jī)的時(shí)候,只影響部分 Topic,而 RocketMQ 一旦主 Broker 宕機(jī),會(huì)影響所有的 Topic。另外,Kafka 可以支持 Broker 間同步復(fù)制(通過設(shè)置 Broker 的?acks?參數(shù)),這樣比的話,RocketMQ 就差太多了。

關(guān)于 RocketMQ 的介紹,網(wǎng)上的文章不算太多,也比較雜,《分布式開放消息系統(tǒng)(RocketMQ)的原理與實(shí)踐》5?6?7這篇原理介紹的不錯(cuò),推薦。

RocketMQ 的工具和編程接口

RocketMQ 的工具

相比較 Kafka 而言,RocketMQ 提供的工具要少一些,如下,

bin/mqadmin
bin/mqbroker
bin/mqbroker.numanode0
bin/mqbroker.numanode1
bin/mqbroker.numanode2
bin/mqbroker.numanode3
bin/mqfiltersrv
bin/mqnamesrv
bin/mqshutdown

除了進(jìn)程啟停之外,常用的運(yùn)維命令都在?mqadmin?中,詳見《RocketMQ 運(yùn)維指令》文檔。我實(shí)驗(yàn)中常用的一些命令如下,

sh mqnamesrv &
sh mqbroker -c async-broker-a.properties &
sh mqbroker -c async-broker-a-s.properties &
sh mqadmin topicList -n 192.168.232.23:9876
sh mqadmin topicRoute -n 192.168.232.23:9876 -t TopicTestjjj
sh mqadmin clusterList -n 192.168.232.23:9876
sh mqadmin deleteTopic -c DefaultCluster -n 192.168.232.23:9876 -t TopicTestjjj
sh mqadmin consumerProgress -n 192.168.232.23:9876 -g ConsumerGroupNamecc4
sh mqadmin deleteSubGroup -c DefaultCluster -n 192.168.232.23:9876 -g ConsumerGroupNamecc4
sh mqadmin consumerConnection -n 192.168.232.23:9876 -g ConsumerGroupNamecc4

RocketMQ 使用了自己的 name server 來做調(diào)度(Kafka 用了 Zookeeper),使用?sh mqnamesrv?來啟動(dòng),默認(rèn)監(jiān)聽端口9876,sh mqnamesrv -m?可以查看所有默認(rèn)參數(shù),使用?-c xxxx.properties?參數(shù)來指定自定義配置。sh mqbroker?是用于啟動(dòng) Broker 的命令,參數(shù)比較多,詳細(xì)可以通過?sh mqbroker -m?查看默認(rèn)參數(shù),配置項(xiàng)細(xì)節(jié)后文再說。sh mqadmin?是運(yùn)維命令入口,topicList?是列出所有 Topic;topicRoute?是列出單個(gè) Topic 的詳細(xì)信息;clusterList?是列出集群的信息;deleteTopic?是刪除 Topic。consumerProgress?是查看消費(fèi)者消費(fèi)進(jìn)度,deleteSubGroup?是刪除消費(fèi)者的訂閱,consumerConnection?是查詢消費(fèi)者訂閱的情況。

Broker 的配置是最多的,實(shí)驗(yàn)中我修改到的部分如下,其他使用默認(rèn),

brokerClusterName=DefaultCluster
brokerIP1=192.168.232.23
brokerName=broker-a
brokerId=0
namesrvAddr=192.168.232.23:9876
listenPort=10911
deleteWhen=04
fileReservedTime=120
storePathRootDir=/home/arnes/alibaba-rocketmq/data/store-a-async
storePathCommitLog=/home/arnes/alibaba-rocketmq/data/store-a-async/commitlog
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

配置文件中的多數(shù)配置看例子就可以知道意思,挑幾個(gè)說一下。brokerName?和?brokerId, 同名的 Broker,ID 是0的是主節(jié)點(diǎn),其他是從節(jié)點(diǎn);deleteWhen,刪除文件時(shí)間點(diǎn),默認(rèn)凌晨4點(diǎn);fileReservedTime,文件保留時(shí)間,設(shè)置為120小時(shí);brokerRole,Broker 的角色,ASYNC_MASTER 是異步復(fù)制主節(jié)點(diǎn),SYNC_MASTER 是同步雙寫主節(jié)點(diǎn),SLAVE 是備節(jié)點(diǎn)。

其實(shí),這些工具的寫法也基本一致,都是先做一些檢查,最后運(yùn)行 Java 程序,JVM 系統(tǒng)上的應(yīng)用應(yīng)該差不多都這樣。

  1. https://github.com/alibaba/RocketMQ?
  2. https://github.com/alibaba/RocketMQ-docs?
  3. http://www.aliyun.com/product/ons?
  4. https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka?
  5. http://www.jianshu.com/p/453c6e7ff81c?
  6. http://blog.csdn.net/lovesomnus/article/details/51776942?
  7. http://www.tuicool.com/articles/f2aaUnV?
  8. https://github.com/alibaba/RocketMQ/wiki/filter_server_guide?

標(biāo)簽: 數(shù)據(jù)庫

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:[譯] 谷歌團(tuán)隊(duì)的容器運(yùn)維最佳實(shí)踐

下一篇:Kafka Controller Redesign方案