(二)RabbitMQ工作模式

交换机类型

1、fanout: 对应Publish/subscribe(发布订阅)工作模式
2、direct: 对应routing工作模式
3、topic: 对应的Topics工作模式
4、headers:对应的headers工作模式

一、work queues

在这里插入图片描述
一个生产者对应多个消费者
1、一个消息只会被一个消费者接收,多个消费端监听同一个队列不会重复消费消息。
2、队列采用轮询机制来平均分发消息(队列中有5条消息,就按照2:2:1分发)
3、消费者在处理完某条消息后,才会收到下一条消息
4、发送消息时不需要指定routingkey
5、work queues交换机类型是默认的

应用场景:
一个复杂的计算,将这个计算分成几部分放到消息队列中,不同的服务器各取一部分进行计算,相对一个服务器处理全部的计算来说,节省了不少时间。

二、Publish/subscribe(发布订阅模式,一人发布多人接收)

在这里插入图片描述
发布订阅模式的特点:
1、一个消息只会被一个消费者接收,多个消费端监听同一个队列不会重复消费消息。
2、生产者发布的5条消息发到交换机上,交换机把5条消息都发到队列1、队列2
3、发送消息时不需要指定routingkey
4、发布订阅模式的交换机类型是FANOUT

应用场景:
用户通知:当用户充值成功或转账完成系统通知用户,通知方式有短信、邮件多种方法 。
队列1为短信通知消息队列,队列2为邮件通知消息队列

Publish/subscribe模式涵盖了work queues模式,相比于work queues更为强大

三、路由模式

在这里插入图片描述
路由模式的特点:
1、生产者发布消息时要指定路由key
2、交换机和队列绑定时要指定路由key
3、生产者发布的消息经由Direct类型交换机,交换机根据routingkey转发消息到指定的队列
4、路由模式的交换机类型是DIRECT

生产者可以指定队列发送消息;也可以添加相同的队列路由key达到发布订阅模式的效果(一人发布全部队列都能接收)

路由模式涵盖了发布订阅模式,相比于发布订阅模式更为强大

应用场景:
有一个商城,新添加了一个商品,实时性不是很高,只需要添加到数据库即可,不用刷新缓存。

四、通配符模式

在这里插入图片描述
注:
“#”匹配一个或多个字符串
“*”匹配一个字符串

通配符模式的特点:
1、和路由模式差异不大,只是路由模式指定的路由key是对等匹配的,
而通配符模式是模糊匹配的,一个抵十个
2、通配符模式的交换机类型是TOPIC

通配符模式涵盖了路由模式,相比于路由模式更为强大

应用场景:
当系统需要处理一些现不必要的消息时,将该路由key为×××.message的消息全部放入一个消息队列中暂存。

五、Headers模式

//声明交换机 参数1-换机名称 参数2-交换机类型
channel.exchangeDeclare(EXCHANGE_HEADERS_INFORM, BuiltinExchangeType.HEADERS);

//声明队列
channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);
channel.queueDeclare(QUEUE_INFORM_SMS, true, false, false, null);

//设置key-value
Map<String, Object> headers_email = new Hashtable<String, Object>();
headers_email.put("inform_type", "email");
Map<String, Object> headers_sms = new Hashtable<String, Object>();
headers_sms.put("inform_type", "sms");

//队列与交换机绑定
channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_HEADERS_INFORM,"",headers_email);
channel.queueBind(QUEUE_INFORM_SMS,EXCHANGE_HEADERS_INFORM,"",headers_sms);

//消息内容
String message = "huang 哈哈哈哈哈!";

//发布消息时指定key-value
Map<String,Object> headers = new Hashtable<String, Object>();
headers.put("inform_type", "email");//匹配email通知消费者绑定的header
AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties.Builder();
properties.headers(headers);

for(int i=0; i<5; i++){
	//发布消息
    channel.basicPublish(EXCHANGE_HEADERS_INFORM, "", properties.build(), message.getBytes());
}

header模式与routing不同的地方在于,header模式取消routingkey,使用header中的 key/value(键值对)匹配队列,但都是通过指定值发送到对应队列的工作模式。

很奇怪不知道为什么我只能指定一个key-value,否则无法发消息到队列中??????

六、RPC模式

在这里插入图片描述
RPC即客户端远程调用服务端的方法 ,使用MQ可以实现RPC的异步调用,基于Direct交换机实现,流程如下:
1、客户端即是生产者就是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列。
2、服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果
3、服务端将RPC方法 的结果发送到RPC响应队列
4、客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果

发布了86 篇原创文章 · 获赞 1 · 访问量 4332

猜你喜欢

转载自blog.csdn.net/qq_42039738/article/details/105255321