RocketMQ的一些特性

一 nameserver
相對來講,nameserver的穩定性很是高。緣由有二:
1 nameserver互相獨立,彼此沒有通訊關係,單臺nameserver掛掉,不影響其餘nameserver,即便所有掛掉,也不影響業務系統使用,這點相似於dubbo的zookeeper。
2 nameserver不會有頻繁的讀寫,因此性能開銷很是小,穩定性很高。
 
二 broker
1 與nameserver關係
  • 鏈接
     單個broker和全部nameserver保持長鏈接
  • 心跳
     心跳間隔:每隔30秒( 此時間沒法更改)向全部nameserver發送心跳,心跳包含了自身的topic配置信息。
     心跳超時:nameserver每隔10秒鐘( 此時間沒法更改),掃描全部還存活的broker鏈接,若某個鏈接2分鐘內(當前時間與最後更新時間差值超過2分鐘,此時間沒法更改)沒有發送心跳數據,則斷開鏈接。
  • 斷開
     時機:broker掛掉;心跳超時致使nameserver主動關閉鏈接
     動做:一旦鏈接斷開,nameserver會當即感知,更新topc與隊列的對應關係,但不會通知生產者和消費者
 
2 負載均衡
  • 一個topic分佈在多個broker上,一個broker能夠配置多個topic,它們是多對多的關係。
  • 若是某個topic消息量很大,應該給它多配置幾個隊列,而且儘可能多分佈在不一樣broker上,減輕某個broker的壓力。
  • topic消息量都比較均勻的狀況下,若是某個broker上的隊列越多,則該broker壓力越大。
 
3 可用性
   因爲消息分佈在各個broker上,一旦某個broker宕機,則該broker上的消息讀寫都會受到影響。因此rocketmq提供了 master/slave的結構,salve定時從master同步數據,若是master宕機,則slave提供消費服務,可是不能寫入消息,此過程對 應用透明,由rocketmq內部解決。
這裏有兩個關鍵點:
  • 一旦某個broker master宕機,生產者和消費者多久才能發現?受限於rocketmq的網絡鏈接機制,默認狀況下,最多須要30秒,但這個時間可由應用設定參數來縮短期。這個時間段內,發往該broker的消息都是失敗的,並且該broker的消息沒法消費,由於此時消費者不知道該broker已經掛掉。
  • 消費者獲得master宕機通知後,轉向slave消費,可是slave不能保證master的消息100%都同步過來了,所以會有少許的消息丟失。可是消息最終不會丟的,一旦master恢復,未同步過去的消息會被消費掉。
 
4 可靠性
  • 全部發往broker的消息,有同步刷盤和異步刷盤機制,總的來講,可靠性很是高
  • 同步刷盤時,消息寫入物理文件纔會返回成功,所以很是可靠
  • 異步刷盤時,只有機器宕機,纔會產生消息丟失,broker掛掉可能會發生,可是機器宕機崩潰是不多發生的,除非忽然斷電
5 消息清理
  • 掃描間隔
     默認10秒,由broker配置參數cleanResourceInterval決定
  • 空間閾值
     物理文件不能無限制的一直存儲在磁盤,當磁盤空間達到閾值時,再也不接受消息,broker打印出日誌,消息發送失敗,閾值爲固定值85%
  • 清理時機
     默認天天凌晨4點,由broker配置參數deleteWhen決定;或者磁盤空間達到閾值
  • 文件保留時長
     默認72小時,由broker配置參數fileReservedTime決定
 
 
6 讀寫性能
  • 文件內存映射方式操做文件,避免read/write系統調用和實時文件讀寫,性能很是高
  • 永遠一個文件在寫,其餘文件在讀
  • 順序寫,隨機讀
  • 利用linux的sendfile機制,將消息內容直接輸出到sokect管道,避免系統調用
7 系統特性
  • 大內存,內存越大性能越高,不然系統swap會成爲性能瓶頸
  • IO密集
  • cpu load高,使用率低,由於cpu佔用後,大部分時間在IO WAIT
  • 磁盤可靠性要求高,爲了兼顧安全和性能,採用RAID10陣列
  • 磁盤讀取速度要求快,要求高轉速大容量磁盤
 
三 消費者
1 與nameserver關係
  • 鏈接
     單個消費者和一臺nameserver保持長鏈接,定時查詢topic配置信息,若是該nameserver掛掉,消費者會自動鏈接下一個nameserver,直到有可用鏈接爲止,並能自動重連。
  • 心跳
與nameserver沒有心跳
  • 輪詢時間
默認狀況下,消費者每隔30秒從nameserver獲取全部topic的最新隊列狀況,這意味着某個broker若是宕機,客戶端最多要30秒才能感知。該時間由 DefaultMQPushConsumer的pollNameServerInteval參數決定,可手動配置。
 
2 與broker關係
  • 鏈接
單個消費者和該消費者關聯的全部broker保持長鏈接。
  • 心跳
默認狀況下,消費者每隔30秒向全部broker發送心跳,該時間由DefaultMQPushConsumer的heartbeatBrokerInterval參數決定,可手動配置。broker每隔10秒鐘(此時間沒法更改),掃描全部還存活的鏈接,若某個鏈接2分鐘內(當前時間與最後更新時間差值超過2分鐘,此時間沒法更改)沒有發送心跳數據,則關閉鏈接,並向該消費者分組的全部消費者發出通知,分組內消費者從新分配隊列繼續消費
  • 斷開
時機:消費者掛掉;心跳超時致使broker主動關閉鏈接
動做:一旦鏈接斷開,broker會當即感知到,並向該消費者分組的全部消費者發出通知,分組內消費者從新分配隊列繼續消費
 
3 負載均衡
集羣消費模式下,一個消費者集羣多臺機器共同消費一個topic的多個隊列,一個隊列只會被一個消費者消費。若是某個消費者掛掉,分組內其它消費者會接替掛掉的消費者繼續消費。
 
4 消費機制
  • 本地隊列
        消費者不間斷的從broker拉取消息,消息拉取到本地隊列,而後本地消費線程消費本地消息隊列,只是一個異步過程,拉取線程不會等待本地消費線程,這種 模式實時性很是高。對消費者對本地隊列有一個保護,所以本地消息隊列不能無限大,不然可能會佔用大量內存,本地隊列大小由DefaultMQPushConsumer的pullThresholdForQueue屬性控制,默認1000,可手動設置
  • 輪詢間隔
     消息拉取線程每隔多久拉取一次?間隔時間由DefaultMQPushConsumer的pullInterval屬性控制,默認爲0,可手動設置。
  • 消息消費數量
     監聽器每次接受本地隊列的消息是多少條?這個參數由DefaultMQPushConsumer的consumeMessageBatchMaxSize屬性控制,默認爲1,可手動設置。
 
5 消費進度存儲
     每隔一段時間將各個隊列的消費進度存儲到對應的broker上,該時間由DefaultMQPushConsumer的persistConsumerOffsetInterval屬性控制,默認爲5秒,可手動設置。
 
6 若是一個topic在某broker上有3個隊列,一個消費者消費這3個隊列,那麼該消費者和這個broker有幾個鏈接?
     一個鏈接,消費單位與隊列相關,消費鏈接只跟broker相關,事實上,消費者將全部隊列的消息拉取任務放到本地的隊列,挨個拉取,拉取完畢後,又將拉取任務放到隊尾,而後執行下一個拉取任務
 
 
四 生產者
1 與nameserver關係
  • 鏈接
     單個生產者者和一臺nameserver保持長鏈接,定時查詢topic配置信息,若是該nameserver掛掉,生產者會自動鏈接下一個nameserver,直到有可用鏈接爲止,並能自動重連。
  • 輪詢時間
默認狀況下,生產者每隔30秒從nameserver獲取全部topic的最新隊列狀況,這意味着某個broker若是宕機,生產者最多要30秒才能感知,在此期間,發往該broker的消息發送失敗。該時間由DefaultMQProducerpollNameServerInteval參數決定,可手動配置。
  • 心跳
與nameserver沒有心跳
 
2 與broker關係
  • 鏈接
單個生產者和該生產者關聯的全部broker保持長鏈接。
  • 心跳
默認狀況下,生產者每隔30秒向全部broker發送心跳,該時間由DefaultMQProducerheartbeatBrokerInterval參數決定,可手動配置。broker每隔10秒鐘(此時間沒法更改),掃描全部還存活的鏈接,若某個鏈接2分鐘內(當前時間與最後更新時間差值超過2分鐘,此時間沒法更改)沒有發送心跳數據,則關閉鏈接。
  • 鏈接斷開
移除broker上的生產者信息
 
3 負載均衡
     生產者時間沒有關係,每一個生產者向隊列輪流發送消息
 
引用連接: http://jameswxx.iteye.com/blog/2091966
相關文章
相關標籤/搜索