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是唯一的

如有问题可在下方发出宝贵的意见和建议

发布了5 篇原创文章 · 获赞 3 · 访问量 822
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览