RabbitMQ五大模式轻松理解

Posted 风影浪子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ五大模式轻松理解相关的知识,希望对你有一定的参考价值。

简要概括RabbitMQ工作模式:

1、简单模式 HelloWorld

一个生产者、一个消费者,不需要设置交换机(使用 默认的交换机)

2、工作队列模式 Work Queue

一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认 的交换机)

3、发布订阅模式 Publish/subscribe

需要设置类型为fanout的交换机,并且交换机和队列进行绑定, 当发送消息到交换机后,交换机会将消息发送到绑定的队列

4、路由模式 Routing

需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

5、通配符模式 Topic

需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的 routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

1、简单模式 HelloWorld

 一个生产者

 一个消费者Consumer

交换机名称为空,未设置交换机,使用默认交换机 

2、工作队列模式 Work Queue

一个生产者

消费者1

消费者2

 两个消费者互为竞争关系,争抢消息的接收,“你一条我一条” 

3、发布订阅模式 Publish/subscribe

设置交换机,类型为FANOUT,发送消息到多个队列

 /**
         * 声明交换机
         * 参数1: 交换机名称
         * 参数2 : 交换机类型  fanout  topic direct  headers
         */
        channel.exchangeDeclare(FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT);

  生产者

队列1的消费者

 队列2的消费者

 交换机绑定队列为并列关系,两个消费者都收到生产者发布的所有消息,不存在竞争关系

4、路由模式 Routing

设置交换机,类型为DIRECT,绑定多个队列并设置RoutingKey

 /**
         * 声明交换机
         * 参数1: 交换机名称
         * 参数2 : 交换机类型  fanout  topic direct  headers
         */
        channel.exchangeDeclare(DIRECT_EXCHANGE, BuiltinExchangeType.DIRECT);

生产者发布两种类型RoutingKey的消息

       // 发送信息
            String message = "新增商品  routing模式--" ;
    /**
     * 参数1:交换机名称,如果没有指定则使用默认Default Exchage
     * 参数2:路由key,简单模式可以传递队列名称
     * 参数3:消息其它属性
     * 参数4:消息内容
     */
            channel.basicPublish(DIRECT_EXCHANGE,"insert", null, message.getBytes());
            System.out.println("已发送消息:" + message);


            message = "修改商品  routing模式--";


            channel.basicPublish(DIRECT_EXCHANGE,"update",null,message.getBytes());
            System.out.println("已发送消息:" + message);

对应的RoutingKey的队列接收交换机发送的对应RoutingKey消息

 

5、通配符模式 Topic

设置交换机,类型为TOPIC,绑定多个队列并设置RoutingKey,且RoutingKey中带有通配符*、#;*表示可以匹配一个词,#表示可以匹配一个或多个词,例子:item.java 、item.java.sout

item.*只能匹配到item.java,item.#可以匹配到item.java和item.java.sout

   // 发送信息
            String message = "新增商品  topic模式--routingkey=insert" ;
    /**
     * 参数1:交换机名称,如果没有指定则使用默认Default Exchage
     * 参数2:路由key,简单模式可以传递队列名称
     * 参数3:消息其它属性
     * 参数4:消息内容
     */
            channel.basicPublish(TOPIC_EXCHANGE,"item.insert", null, message.getBytes());
            System.out.println("已发送消息:" + message);


            message = "修改商品  topic模式--routingkey=update";


            channel.basicPublish(TOPIC_EXCHANGE,"item.update",null,message.getBytes());
            System.out.println("已发送消息:" + message);


            message = "删除商品  topic模式--routingkey=delete";

            channel.basicPublish(TOPIC_EXCHANGE,"item.delete.delete",null,message.getBytes());
            System.out.println("已发送消息:" + message);

 RoutingKey设置为item.*的队列的消费者接收到的消息为

  RoutingKey设置为item.#的队列的消费者接收到的消息为

总结:

RabbitMQ的五种工作模式区别在于:

问:是否设置交换机?设置的交换机类型是什么?

答:前两种没有设置交换机,后三者设置了交换机,其类型分别为FANOUT,DIRECT,TOPIC,类型不同,实现的功能也不同。

RabbitMQ分析的结果:首先,设置了交换机,模式多样,功能更强;在设置了交换机的基础上,设置交换机的类型不同,实现的功能也不同。如果没有设置交换机,即使用默认交换机,其模式简单,功能有限。

以上是关于RabbitMQ五大模式轻松理解的主要内容,如果未能解决你的问题,请参考以下文章

面试官:RabbitMQ有哪些工作模式?

RabbitMQ基础理解

五大方式轻松提供卓越客户服务!

Java实战,轻松理解魔法般的代理模式

RabbitMQ路由模式(Routing)

RabbitMQ路由模式(Routing)