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数量发生变化的时候,会收到通知,然后用户可以自己更改自己的消费策略,总而言之,就是用户有足够的自由度,可以自己决定很多事情。

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