更新時間:2021-11-23 09:44:28 來源:動力節(jié)點 瀏覽1843次
高級Activemq面試題及答案:

1.client用了transaction且再session中調(diào)用了rouback()
2.client用了transaction且再調(diào)用了commit()之前關(guān)閉或者沒有commit
3.client再client-ACKNOMEDGE的傳遞模式下,在session中調(diào)用了recaver()
間隔:1
次數(shù):6
一個消息被redelivedred超過默認(rèn)的最大重發(fā)次數(shù)(默認(rèn)次數(shù)是6)時,消費端會給MQ發(fā)送一個“poison ack” 表示這個消息有毒,告訴broker不要再發(fā)了,這個時候broker會把這個消息放到DLQ(死信隊列)
ActiveMQ中引入了 死信隊列 的概念,即一條消息再被重發(fā)多次后(默認(rèn)是6)
將會被ActiveMQ移入死信隊列,程序員 也就是我們可以在這個Queue中查看處理出錯的消息,進(jìn)行人工干預(yù)。
死信隊列的使用:處理失敗的消息
一般生產(chǎn)環(huán)境中,使用MQ的時候,設(shè)計兩個隊列:一個核心隊列,一個死信隊列
核心業(yè)務(wù)隊列就是比如用訂單系統(tǒng)發(fā)送訂單消息,然后另外一個死信隊列用來處理異常的情況。
假如第三方物流系統(tǒng)故障了,此時無法請求,那么倉儲系統(tǒng)每次消費到一條訂單消息,嘗試通知發(fā)貨和配送都會遇到對方的接口報錯。此時倉儲系統(tǒng)就可以把這條消息拒絕訪問或者標(biāo)志為處理失敗。一旦標(biāo)志這條消息處理失敗后,MQ就會把這條消息轉(zhuǎn)入提前設(shè)置好的一個死信隊列中,然后你會看到的就是在第三方的物流系統(tǒng)故障期間,所以訂單消息全部處理失敗,全部轉(zhuǎn)入死信隊列,然后你的倉儲系統(tǒng)得到專門有一個后臺線程監(jiān)控第三方物流系統(tǒng)是否正常運行,能否請求到,不停的監(jiān)控,一旦發(fā)現(xiàn)對方恢復(fù)正常,這個后臺線程就可以從死信隊列消費出來 處理失敗的訂單,重新執(zhí)行發(fā)貨和配送的通知邏輯
網(wǎng)絡(luò)延遲傳輸,會造成ActiveMQ重試中,在重試過程中,可能會造成重復(fù)消費
如果消息是做數(shù)據(jù)庫插入操作;給這個消息做一個唯一主鍵,那么就算出現(xiàn)重復(fù)消費,就導(dǎo)致主鍵沖突,避免出現(xiàn)臟數(shù)據(jù)
如果上述面兩種情況還是不行,準(zhǔn)備一個第三方服務(wù)來做消費記錄,以redis為例,給消息分配一個全局ID,只要消費國這個消息,將 以K-V的形式寫入redis,那么消費者開始消費前,先去redis中直接查詢有沒有消費記錄即可