消息队列(5):RocketMQ
介紹
RocketMQ是一款成熟的分布式消息中間件。
由阿里2012年開源,2017年成為Apache頂級(jí)項(xiàng)目。
源碼是java寫的。
高性能,低延遲,高可靠。歷經(jīng)多次雙十一大促,整體很穩(wěn)定。
RocketMQ對(duì)比其他mq的優(yōu)勢(shì)
對(duì)比kafka和Rabbitmq,RocketMQ優(yōu)勢(shì)如下:
1.支持事務(wù)型消息。
2.可以支持指定時(shí)間的延遲消費(fèi),但不能指定任意時(shí)間,RocketMQ有18個(gè)延遲級(jí)別。
3.支持消費(fèi)失敗的重試。
4.consumer可以tag過濾,tag可以理解為比topic更一個(gè)細(xì)粒度的子主題。
5.支持重復(fù)消費(fèi),這個(gè)kafka也支持。
RocketMQ需要注意
Rocket不能完全保證消息的消費(fèi)是有且只有一次,只能保證至少一次。
所以在設(shè)計(jì)消費(fèi)端的時(shí)候,要特別注意冪等性。或者你的系統(tǒng)允許少量的消息重復(fù)。
RocketMQ核心四大組件
NameService,Broker,Producer,Consumer
每個(gè)組件可以部署成集群模式水平擴(kuò)展。
1、Producer負(fù)責(zé)發(fā)消息,有3種發(fā)送方式
1.同步發(fā)送:重要場(chǎng)景,發(fā)一條要等接收方反饋成功,才會(huì)繼續(xù)發(fā)。
2.異步發(fā)送:對(duì)響應(yīng)時(shí)間有要求的場(chǎng)景,發(fā)一條后不等反饋,直接再發(fā)。
3.單向發(fā)送:量大但可靠性要求不高的場(chǎng)景,如日志收集。
同步發(fā)送就像打電話,你說(shuō)一句,聽到對(duì)面反饋了,再說(shuō)。
異步發(fā)送就像發(fā)微信,你只管一直發(fā),對(duì)面看到后也會(huì)反饋。
單向發(fā)送就像寫信,寫出去就不管了
2、Consumer負(fù)責(zé)消費(fèi)消息,有2種消費(fèi)方式
1.拉取型消費(fèi)(DefaultMQPushConsumer):主動(dòng)拉消息
2.推送型消費(fèi)(DefaultMQPullConsumer):先去注冊(cè)消費(fèi)監(jiān)聽器,監(jiān)聽器被觸發(fā)才會(huì)消費(fèi)
3、Broker負(fù)責(zé)存儲(chǔ)消息
接收Producer發(fā)的消息,存儲(chǔ),Consumer從這里拉取消息。
Broker有兩個(gè)角色,Master和Slave。了解分布式協(xié)議的,對(duì)這兩個(gè)主從角色肯定不陌生。
Broker集群部署有4種方式:
1.單Master,即只有一個(gè)主
一旦宕機(jī),服務(wù)不可用,單機(jī)測(cè)試用,生產(chǎn)不會(huì)用
2.多Master,即都是主
單個(gè)Master宕機(jī),服務(wù)還是可用的,但宕機(jī)期間該機(jī)器的消息不能被實(shí)時(shí)消費(fèi)了
3.多Master多Slaver(同步雙寫)
每個(gè)Master都配一個(gè)Slaver,寫消息的時(shí)候,主從都寫成功才算成功。
這個(gè)是解決了上一個(gè)主宕機(jī)后消息不能被實(shí)時(shí)消費(fèi)的問題,但由于得寫兩份,性能略受影響
4.多Master多Slaver(異步復(fù)制)
每個(gè)Master都配一個(gè)Slaver,寫消息的時(shí)候,主成功就成功返回,之后異步復(fù)制消息到從。
主從消息延遲是毫秒級(jí)。
這個(gè)是解決了上一個(gè)寫兩份的性能問題,但在主宕機(jī)且不可恢復(fù)的情況下,可能會(huì)由于消息延遲復(fù)制的原因,導(dǎo)致少量消息丟失。
這四種方式,每一種都是為了解決上一種的問題所作出的改進(jìn),但同時(shí)又會(huì)帶來(lái)新的問題。
但慢慢的,可以將問題降到一個(gè)可人為控制并且可接受的范圍內(nèi)。
所以,在不考慮成本的情況下,第四種是最優(yōu)的,但往往企業(yè)都會(huì)將成本放在比較高的位置,所以魚與熊掌不可兼得。
4、NameServer負(fù)責(zé)保存Broker相關(guān)元信息并給生產(chǎn)者和消費(fèi)者查找Broker信息
每個(gè)Broker啟動(dòng)的時(shí)候都會(huì)在NameServer注冊(cè),生產(chǎn)者在發(fā)送消息前也會(huì)根據(jù)Topic到這里獲取Broker的路由信息。消費(fèi)者也會(huì)定時(shí)獲取topic的路由信息。
完全可以將NameServer理解成一個(gè)注冊(cè)中心,因?yàn)樵缙跊]有NameServer的時(shí)候,這個(gè)位置是用Zookeeper代替的。
5、ProducerGroup & ConsumerGroup
ProducerGroup可以理解為一個(gè)發(fā)消息的應(yīng)用,一個(gè)Producer Group下包含多個(gè)Producer實(shí)例。
ConsumerGroup可以理解為一個(gè)拿消息應(yīng)用,一個(gè)Consumer Group下包含多個(gè)Consumer實(shí)例。
Producer實(shí)例或者Consumer實(shí)例,可以是多態(tài)機(jī)器,也可以是一臺(tái)機(jī)器的多個(gè)進(jìn)程,也可以是一個(gè)進(jìn)程的多個(gè)對(duì)象。
一個(gè)Producer Group可以發(fā)送多個(gè)Topic消息。
一個(gè)Consumer Group下的多個(gè)Consumer以均攤方式消費(fèi)消息,如果設(shè)置為廣播方式,那么這個(gè)Consumer Group下的每個(gè)實(shí)例都消費(fèi)全量數(shù)據(jù)。
RocketMQ的消息Message
topic:
一條消息必須要有一個(gè)主題topic,這個(gè)和大部分消息中間件一樣。
tag:
此外Message還有一個(gè)標(biāo)簽的概念,可以理解為子主題,可用可不用。
同一個(gè)topic下,當(dāng)消息還有更細(xì)粒度的區(qū)分時(shí),就可以通過tag標(biāo)簽來(lái)標(biāo)記。
RocketMQ的消費(fèi)模式
集群消費(fèi)
默認(rèn)是集群消費(fèi)。
一個(gè)消費(fèi)者集群共同消費(fèi)一個(gè)主題。
廣播消費(fèi)
消息會(huì)發(fā)給消費(fèi)組中的每一個(gè)消費(fèi)者消費(fèi)。
批量消費(fèi)
consumer.setConsumeMessageBatchMaxSize(10);總結(jié)
以上是生活随笔為你收集整理的消息队列(5):RocketMQ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个java工程师必知的安全意识(信息传
- 下一篇: [设计模式] ------ 策略模式实战