首先, RocketMQ Consumer 的负载均衡指的是把Topic 下的所有MessageQueue 分配到不同的 Consumer 中,所以Message Queue , Consumer 的数量,某个Consumer 的位置 会影响到负载均衡。
这边介绍下环形平均分配的算法:所有Consumers 形成一个环,所有MessageQueues 依次分配到环上每个Consumer。 代码如下,注释有解释:
/**
环形平均分配: 所有Consumers 形成一个环,所有MessageQueues 依次分配到环上每个Consumer。 环形平均分配
*/
public class MyAllocateMessageQueueAveragelyByCircle implements AllocateMessageQueueStrategy {
@Override
public List<MessageQueue> allocate(String consumerGroup, String currentCID, List<MessageQueue> mqAll, List<String> cidAll) {
// 这里省略校验部分,重点关注算法
List<MessageQueue> result = new ArrayList<>();
int index = cidAll.indexOf(currentCID); // 当前consumer 的下标
for (int i = index; i < mqAll.size(); i++) {
if (i % mqAll.size() == index) { // 下标为i 的MessageQueue 分别给 下标为i 的 consumer.
result.add(mqAll.get(i));
}
}
return result;
}
@Override
public String getName() {
return null;
}
}