RocketMQ Consumer 負載均衡演算法學習 -- AllocateMessageQueueAveragelyByCircle
阿新 • • 發佈:2018-10-31
首先, 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; }
}