rocketmq負載均衡

消息隊列的是可以允許有多個producer和consumer同時工作的,那麼爲了使這些producer和consumer在一起工作時能協調好,那麼就需要負載均衡。那麼如何實現負載均衡呢,首先就要知道一些全局信息,也就是該topic下有多少個broker,有多少個messageQueue,知道了這些,才能通過某種算法來分配。

其實要知道這些,也不難,首先一個topic下的數據,保存在那些broker中,有那些messageQueue,都記錄在NameServer中,客戶端只要連上NameServer,這些信息都可以獲取到,並且這些信息,對於producer來說就已經夠了,一個producer所要做的負載均衡,就是將消息輪流的發送到一個topic下的所有messageQueue中,所以producer的負載均衡就很簡單,也不需要用戶去操心。

那麼consumer的負載均衡是怎麼做的呢,對於廣播消費來說,是不需要進行負載均衡的,因爲每個消費端,都是要消費所有的消息的,以下我們討論的都是集羣消費的模式。首先consumer有兩種消費方式,pull和push,分別對應的就是DefaultMQpushConsumer和DefaultMQPullConsumer,對於DefaultMQPushConsumer,他的負載均衡也是不需要用戶關心的,完全是自動完成的,在進行負載均衡之前,我們除了知道上面說的那些信息之外,還需要知道的信息就是同一個consumerGroup中,其他的消費者的信息,簡單來說,就是除了自己,還有幾個消費者要一起來合作,一起消費,知道了人數之後,纔好分配工作嘛,那這個信息是怎麼知道的呢,原來每個consumer在從nameServer中獲取到了topic下的broker信息之後,都會向該topic下的所有broker建立長連接,並且broker也會把consumer中的信息記錄下來,所以只要問broker就可以很簡單的知道,除了我,還有幾個相同consumerGroup的消費者現在也在消費,那麼知道了數量之後,負載均衡就很簡單啊,我們舉個最簡單的負載均衡的例子,平均分配策略,假如現在有16個consumerQueue,4個消費者,那麼就是每個消費者根據自己在消費者組中的位置,選取對應的4個queue,不會重複,這個需要說明的有兩點,負載均衡分配的是queue,不是broker,還有就是同一個queue,只會分配給一個消費者。然後每個消費者,就會去自己的那些queue中消費消息,並且在有新的消費者加入,都會觸發所有同組中其他消費者的doRebalance動作,重新負載均衡,而且客戶端也會定期去同步對應的信息,如果發現有消費者下線了,或者增加了新的queue,也會觸發doRebalance動作,所以DefaultMQPushConsumer是一種相對用戶來說非常簡單的消費方式。

DefaultMQPullConsumer是需要用戶自己去進行負載均衡的,因爲可以看到所有的messageQueue,從哪個messageQueue讀取消息,讀取消息時的offset,都是由用戶自己控制的,並且可以通過在consumer中註冊MessageQueueLister,當有消費者數量或者queue數量發生變化的時候,會收到通知,然後用戶可以自己更改自己的消費策略,總而言之,就是用戶有足夠的自由度,可以自己決定很多事情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章