https://zhuanlan.zhihu.com/p/159017211
看着這算法凌亂的很,太復雜了!說實話,確實挺復雜,蠻羅嗦的,但是代數法可以得到如下表格:
假設4個queueConsumer有2個可以整除Consumer有3個不可整除Consumer有5個無法都分配queue[0]Consumer[0]Consumer[0]Consumer[0]queue[1]Consumer[0]Consumer[0]Consumer[1]queue[2]Consumer[1]Consumer[1]Consumer[2]queue[3]Consumer[1]Consumer[2]Consumer[3]
所以得出如下真香定律(也是回擊面試官的最佳答案):
- queue個數大於Consumer個數,且queue個數能整除Consumer個數的話, 那么Consumer會平均分配queue。(比如上面表格的Consumer有2個 可以整除部分)
- queue個數大於Consumer個數,且queue個數不能整除Consumer個數的話, 那么會有一個Consumer多消費1個queue,其余Consumer平均分配。(比如上面表格的Consumer有3個 不可整除部分)
- queue個數小於Consumer個數,那么會有Consumer閑置,就是浪費掉了,其余Consumer平均分配到queue上。(比如上面表格的Consumer有5個 無法都分配部分)
當一個consumer出現宕機后,默認最多20s,其它機器將重新消費已宕機的機器消費的queue
新啟動Consumer的話會立即喚醒沉睡的線程, 讓他立馬進行this.mqClientFactory.doRebalance();