比照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进行发送数据。
简略的说,就是轮询。
因为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。
在这种机制下,每次发送音讯的时候,也是通过轮询的,然而轮询拿出一个MessageQueue,就会去判断这个broker-a是否在延迟时间内,如果还须要期待,那就持续轮询下一个MessageQueue。
如果都在延迟时间内,那就找一个绝对可用的,如果也没有绝对可用的,那就持续轮询,间接返回对应的MessageQueue。