rabbitmq exchange與queue莫名其妙解綁
阿新 • • 發佈:2018-11-08
現象:
研發反應,生產者向指定的exchange中傳送訊息,但是解綁之後
訊息就不能發到指定的隊列了。
原因: 生產者是作為守護程序執行的,只在首次啟動的時候宣告exchange,宣告的時候會指定routingkey,但消費程序在連線rabbitmq的時候,也會宣告exchange,但這個時候的宣告沒有指定routingkey的值為空,導致原來生產者宣告的exchange的routingkey資訊被覆蓋了,出現的問題就是一個exchange的routingkey為空,卻路由到多個queue導致當一個訊息被推送到exchange之後,就不能確定該訊息會被路由到哪個queue了,因為沒有到指定的queue中,所以看起來就像是推送的訊息丟失了。
解決辦法:
消費程序改程式碼,
現在把宣告exchange的程式碼去掉。只監聽queue,不去更改routing key。
排查過程: 1,確認生產者推送訊息確實成功了,根據研發提供的日誌可以確認這一點。 INFO com.shein.pss.utils.MqSender - [推送訊息{"chkaccNumber":"D20180522000024","checkStatus":2,"optName":"system","sourceSystem":"PMS_test","checkResult":4}成功] 我們這邊顯示了以後,對方說這條訊息沒進 INFO com.shein.pss.utils.MqSender - [推送訊息{"chkaccNumber":"D20180522000024","checkStatus":2,"optName":"system","sourceSystem":"PMS_test","checkResult":4}成功]
2,研發反應: 有問題的佇列是pss_checkAccount_checkResult_queue_pms_test 這個佇列,我剛觀察條一個資訊,有一條訊息 unack了 然後又ack了 之後就解綁了。
但消費程序一啟動,就有了空繫結,所以完全可以確定就是消費程序的程式碼問題。
原因: 生產者是作為守護程序執行的,只在首次啟動的時候宣告exchange,宣告的時候會指定routingkey,但消費程序在連線rabbitmq的時候,也會宣告exchange,但這個時候的宣告沒有指定routingkey的值為空,導致原來生產者宣告的exchange的routingkey資訊被覆蓋了,出現的問題就是一個exchange的routingkey為空,卻路由到多個queue導致當一個訊息被推送到exchange之後,就不能確定該訊息會被路由到哪個queue了,因為沒有到指定的queue中,所以看起來就像是推送的訊息丟失了。
排查過程: 1,確認生產者推送訊息確實成功了,根據研發提供的日誌可以確認這一點。 INFO com.shein.pss.utils.MqSender - [推送訊息{"chkaccNumber":"D20180522000024","checkStatus":2,"optName":"system","sourceSystem":"PMS_test","checkResult":4}成功] 我們這邊顯示了以後,對方說這條訊息沒進 INFO com.shein.pss.utils.MqSender - [推送訊息{"chkaccNumber":"D20180522000024","checkStatus":2,"optName":"system","sourceSystem":"PMS_test","checkResult":4}成功]
2,研發反應: 有問題的佇列是pss_checkAccount_checkResult_queue_pms_test 這個佇列,我剛觀察條一個資訊,有一條訊息 unack了 然後又ack了 之後就解綁了。
- 我把原來的佇列都刪了
- 重啟了測試環境的生產者程序程式碼
- 發現並沒有繫結空的routing key
但消費程序一啟動,就有了空繫結,所以完全可以確定就是消費程序的程式碼問題。