RabbitMQ 6种工作模式

简介:主要介绍了兔的4种工作模式,先前的入门程序已经介绍了简单模式的运作模式,还有一种RPC模式不在这里介绍和演示。

工作模式

先前介绍过,兔有6种不同的工作模式, 除去先前介绍的简单模式外,还有其他5种工作模式。

Working Queue 工作队列

image.png

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

改造生产者代码,让其发送多条消息到工作队列中 image.png

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

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

Pub/Sub 订阅

image.png

在订阅模型中,多了一个 Exchange 角色,而且过程略有变化 交换机一方面接收生产者发送的消息。另一方面,能够根据自己的类型处理消息 交换机有 3种 常见类型:

Fanout:广播,将消息交给所有绑定到交换机的队列 Direct:定向,把消息交给符合指定 routing key 的队列 Topic :通配符,把消息交给符合 routing pattern 的队列

交换机只符合转发消息,不具备存储消息的能力!

需要使用 Channel 类中二的方法 创建一个交换机。

// 创建交换机
channel.exchangeDeclare("test_fanout",
                        BuiltinExchangeType.FANOUT,
                        true,false,false,null);
image.png

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类中绑定的方法 image.png

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

image.png

image.png

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

Routing Mode 路由模式

image.png

生产者将消息发送给 交换机 (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);

运行代码,在管理台交换机面板查看绑定结果

image.png

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

image.png

队列与交换机的绑定,需要指定一个 RoutingKey 消息向交换机发送消息时,也必须要指定消息的 RoutingKey 交换机不再把消息交给每一个绑定的队列,而是根据消息的 RoutingKey 进行判断,只有队列绑定的 RoutingKey 与消息的 RoutingKey 完全一致,才能拿到消息

适用于不同类型的消费者订阅不同类型的消息的场景,如不同服务接收不同的日志类型。

Topic Mode 通配符模式

image.png

生产者将消息发送给 交换机,并附带 主题(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);

运行代码,查看管理台中的交换机绑定信息 image.png

已经绑定了队列,并且指定了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());

检查管理台队列收到信息 image.png

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

适用于消息分类更加灵活、多样化的场景,比如日志分发系统,处理不同优先级、不同级别的日志。

RPC 模式

Remote Procedure Call Mode 生产者发送消息(请求)到队列,并等待消费者处理后返回结果(响应) 消费者从队列中接收请求,处理后将结果发送回生产者。

  • 用于模拟远程过程调用(Remote Procedure Call, RPC)的模式,生产者等待一个结果。
  • 使用专门的回复队列来接收结果。

适用于需要请求-响应模型的场景,如远程服务调用、异步任务处理等。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇