RabbitMq 交叉消費問題

在實際開發中,因爲多人開發,你無法保證每個人在使用一些框架的時候不出現問題,臂如今天我們要說的rabbitMq交叉消費,這裏的交叉消費是一個很大的問題,但是rabbitMQ是允許他這種特性存在,如果我們不清楚這個特性的存在,會導致收到不應該收到的消息,輕者增加消費端壓力,重者增加數據錯亂(我不是開玩笑的)。
這就等同我給我的女朋友(小美)發消息,我的女朋友(小紅)也收到了。如果我說的是(小美今晚我去你家)? 哦豁,完犢子了吧。要翻車了吧,不嘚瑟了吧。
有人說不信?不信你往下看

創建routingkey與queue的綁定關係如下

1、Exchange = ddzl.gpu.center123
2、queue=queue.ddzl.gpu.center.discern.msg123 與 routingkey =queue.ddzl.gpu.center.discern.msg123 綁定
3、queue=queue.ddzl.gpu.center.discern.msg123 與 routingkey = queue.ddzl.gpu.center.discern.msg123.key綁定
在這裏插入圖片描述

可以看到。Exchange = ddzl.gpu.center123 兩個不同的routingkey 對應的queue相同。

問題

我們先看下存在的問題,我的生產者往Routing key爲:queue.ddzl.gpu.center.discern.msg123.key 發送的消息,
我的消費者Routing key爲:queue.ddzl.gpu.center.discern.msg123卻可以收到消息。

試驗

消費者

Exchange   		ddzl.gpu.center123
Routing key爲:	queue.ddzl.gpu.center.discern.msg123
Queue爲:		queue.ddzl.gpu.center.discern.msg123

生產者

public class Producer {

    private static final String EXCHANGE_NAME = "ddzl.gpu.center123";

    private static final String  ROUTING_KEY = "queue.ddzl.gpu.center.discern.msg123.key";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        String message = "routing_key = "+ROUTING_KEY+",exchange_name = "+EXCHANGE_NAME;

//        channel.queueBind("queue.ddzl.gpu.center.discern.msg123", EXCHANGE_NAME, ROUTING_KEY);
        //聲明交換機
//        channel.exchangeDeclare(EXCHANGE_NAME,"topic");
        channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,false,false,null,message.getBytes());

        channel.close();
        connection.close();
    }
}

試驗步驟

1.創建exchange與routingkey的綁定關係,關係如下
在這裏插入圖片描述
Exchange = ddzl.gpu.center123 兩個不同的routingkey 對應的queue相同

2.啓動消費者監聽
3.生產者發送消息
4.觀察結果
此時

消費者的配置爲  
Exchange   		ddzl.gpu.center123
Routing key爲:	queue.ddzl.gpu.center.discern.msg123
Queue爲:		queue.ddzl.gpu.center.discern.msg123
生產者的配置爲
Routing key爲:	queue.ddzl.gpu.center.discern.msg123.key
Exchange 爲:	ddzl.gpu.center123

消費者控制檯日誌 可以準確收到消息
在這裏插入圖片描述

結果

經過了一番試驗,證明了一個可怕的事實,就是當同一個Exchange,同一個queue, 不同的routingkey 時,無論生產者發送消息是送往那個routingkey的,其他的routingkey都會收到消息。

所以在開發中,我們應該避免這種問題的出現,保證mq中的routingkey+queue是唯一的

如有問題可在下方發出寶貴的意見和建議

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章