简介:主要介绍了兔的4种工作模式,先前的入门程序已经介绍了简单模式的运作模式,还有一种RPC模式不在这里介绍和演示。
工作模式
先前介绍过,兔有6种不同的工作模式, 除去先前介绍的简单模式外,还有其他5种工作模式。
Working Queue 工作队列

与入门程序的简单模式相比,工作队列方式是简单模式的拓展,多个消费端共同处理一个队列中的信息。 RabbitMQ 通过轮询等方式,将消息分发给每个消费者
改造生产者代码,让其发送多条消息到工作队列中

并新建一个消费者,运行代码

一个队列中多个消费者从同一个队列中竞争消息 在多个消费者之间进行任务分配,适用于在工作负载较重的场景
Pub/Sub 订阅

在订阅模型中,多了一个 Exchange 角色,而且过程略有变化 交换机一方面接收生产者发送的消息。另一方面,能够根据自己的类型处理消息 交换机有 3种 常见类型:
Fanout:广播,将消息交给所有绑定到交换机的队列 Direct:定向,把消息交给符合指定 routing key 的队列 Topic :通配符,把消息交给符合 routing pattern 的队列
交换机只符合转发消息,不具备存储消息的能力!
需要使用 Channel 类中二的方法 创建一个交换机。
// 创建交换机
channel.exchangeDeclare("test_fanout",
BuiltinExchangeType.FANOUT,
true,false,false,null);

Exchange:交换机名称 Type:交换机类型 durable:是否持久化 autoDelete:是否自动删除 internal:是否内部使用 arguments:参数列表
创建队列
//创建队列
channel.queueDeclare("test_fanout_queue1",true,false,false,null);
channel.queueDeclare("test_fanout_queue2",true,false,false,null);
绑定交换机
//绑定交换机
channel.queueBind("test_fanout_queue1","test_fanout","",null);
channel.queueBind("test_fanout_queue2","test_fanout","",null);
Channel类中绑定的方法

运行代码,可以看到创建的交换机,并绑定成功了两个队列。


并可以看到 fanout 模式下,所有queue都会收到这个信息 适用于消息需要广播给多个消费者的场景,如系统日志、新闻分发等。
Routing Mode 路由模式

生产者将消息发送给 交换机 (Exchange),并附带 路由键 (RoutingKey) 交换机根据路由键,将消息发送到与路由键匹配的队列。
使用 定向类型(direct)的交换机,允许生产者通过路由键有选择性的发送消息。 消息会根据路由键,发送到指定的一个或多个队列。
绑定队列时,要在 routingKey 中加入指定的路由键,交换机Direct接收到消息后,会根据路由键将消息发送到指定的队列中去
channel.queueBind("test_direct_queue1","test_direct","orange",null);
channel.queueBind("test_direct_queue2","test_direct","black",null);
channel.queueBind("test_direct_queue2","test_direct","green",null);
运行代码,在管理台交换机面板查看绑定结果

说明绑定成功。 此时创建并运行消费者代码,可以收到队列中的消息

队列与交换机的绑定,需要指定一个 RoutingKey 消息向交换机发送消息时,也必须要指定消息的 RoutingKey 交换机不再把消息交给每一个绑定的队列,而是根据消息的 RoutingKey 进行判断,只有队列绑定的 RoutingKey 与消息的 RoutingKey 完全一致,才能拿到消息
适用于不同类型的消费者订阅不同类型的消息的场景,如不同服务接收不同的日志类型。
Topic Mode 通配符模式

生产者将消息发送给 交换机,并附带 主题(Topic) 交换机会根据主题模式,将消息发送到符合条件的队列。
使用 topic 类型的 交换机,允许生产者通过复杂的模式匹配(类似通配符的方式)发送消息
队列可以根据绑定的主题模式接收响应的消息。
路由键通常是点分隔的词汇,比如 log.info 或 log.error , 可以使用 * 和 # 来匹配部分路由键。
绑定队列时,使用通配符来匹配路由键
channel.queueBind("test_topic_queue1","test_topic","*.orange.*",null);
channel.queueBind("test_topic_queue2","test_topic","*.*.rabbit",null);
channel.queueBind("test_topic_queue2","test_topic","lazy.#",null);
运行代码,查看管理台中的交换机绑定信息

已经绑定了队列,并且指定了topic
模拟发送信息
String msg1 = "q1";
String msg2 = "q2";
String msg3 = "q2 but msg3";
channel.basicPublish("test_topic","eat.orange.apple",null,msg1.getBytes());
channel.basicPublish("test_topic","jumpy.jumpy.rabbit",null,msg2.getBytes());
channel.basicPublish("test_topic","lazy.me",null,msg3.getBytes());
检查管理台队列收到信息

创建消费者并运行,收到消息。

适用于消息分类更加灵活、多样化的场景,比如日志分发系统,处理不同优先级、不同级别的日志。
RPC 模式
Remote Procedure Call Mode 生产者发送消息(请求)到队列,并等待消费者处理后返回结果(响应) 消费者从队列中接收请求,处理后将结果发送回生产者。
- 用于模拟远程过程调用(Remote Procedure Call, RPC)的模式,生产者等待一个结果。
- 使用专门的回复队列来接收结果。
适用于需要请求-响应模型的场景,如远程服务调用、异步任务处理等。