1

对比kafka -- 分区是怎么指定的

kafka是有Partition的概率,发送消息的时候,跟进分区规则进行选择哪个Partition,每个Partition都有自己对应的broker。

RocketMQ有MessageQueue,类似于Partition,发送消息的时候,也是先选择MessageQueue,然后根据MessageQueue对应的broker信息发送给对应的broker。

MessageQueue选择有两种,启用Broker故障延迟机制不启用Broker故障延迟机制,默认不启用。

不启用Broker故障延迟机制

刚开始的时候,会有一个随机值,比如5,然后对MessageQueue的个数进行取模,为1,然后就对第二个MessageQueue的broker进行发送数据。

下一个消息,这个随机值就会加1,取模后为2,对第三个MessageQueue的broker进行发送数据。

简单的说,就是轮询。

image.png

由于broker可能会出现问题,比如MessageQueue-0对应的broker为broker-a,MessageQueue-1也是broker-a。

那发送给MessageQueue-0的broker-a失败的时候,会把broker-a记录下来,重试的时候,会继续迭代,此时是MessageQueue-1,broker也是broker-a,那就会往下轮询,去找MessageQueue-2,通过MessageQueue-2进行发送消息。

这样的机制,就会避免重试到同一个broker,减低失败的可能性。

启用Broker故障延迟机制

MQ发送消息的时候,会记录这个消息发送的时间,如果broker-a是50毫秒,那下次发送就可以直接发,如果是550毫秒,那需要等30秒后才可以发给broker-a,规则同下表。

那比如是800毫秒呢,由于是介于550到1000直接,所以算550这个档,也就是延迟30秒。

如果是broker故障等导致失败,则会直接当作3万毫秒,相当于600秒内不能发送这个broker。

image.png

在这种机制下,每次发送消息的时候,也是通过轮询的,但是轮询拿出一个MessageQueue,就会去判断这个broker-a是否在延迟时间内,如果还需要等待,那就继续轮询下一个MessageQueue。

如果都在延迟时间内,那就找一个相对可用的,如果也没有相对可用的,那就继续轮询,直接返回对应的MessageQueue。


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆