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