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