在實際開發中,因爲多人開發,你無法保證每個人在使用一些框架的時候不出現問題,臂如今天我們要說的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是唯一的
如有問題可在下方發出寶貴的意見和建議