1. 程式人生 > >RocketMQ Consumer 負載均衡演算法學習 -- AllocateMessageQueueAveragelyByCircle

RocketMQ Consumer 負載均衡演算法學習 -- AllocateMessageQueueAveragelyByCircle

首先, 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;
}

}