RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
rabbitMQ是一款基于AMQP协议的消息中间件,它能够在应用之间提供可靠的消息传输。在易用性,扩展性,高可用性上表现优秀。使用消息中间件利于应用之间的解耦,生产者(客户端)无需知道消费者(服务端)的存在。而且两端可以使用不同的语言编写,大大提供了灵活性。
1、安装
![](https://img.haomeiwen.com/i13717038/a8c9cd2d595b4555.png)
2、rabbitMQ工作模型
简单模式
![](https://img.haomeiwen.com/i13717038/d91758f0ccc1e5ae.png)
![](https://img.haomeiwen.com/i13717038/28172a797c8f7a7d.png)
相关参数
1.no-ack = False
如果消费者遇到情况(its channel is closed, connection is closed, or TCP connection is lost)挂掉了,那么,RabbitMQ会重新将该任务添加到队列中。
回调函数中的 ch.basic_ack(delivery_tag=method.delivery_tag)
basic_comsume中的no_ack=False
接收消息端应该这么写:
![](https://img.haomeiwen.com/i13717038/ba5ba309dc9cd1bd.png)
2.durable :消息不丢失
![](https://img.haomeiwen.com/i13717038/dcb86fd85a8af0cb.png)
![](https://img.haomeiwen.com/i13717038/21c2817d9b11910e.png)
3.消息获取顺序
默认消息队列里的数据是按照顺序被消费者拿走,例如:消费者1 去队列中获取 奇数 序列的任务,消费者1去队列中获取 偶数 序列的任务。
channel.basic_qos(prefetch_count=1) 表示谁来谁取,不再按照奇偶数排列
![](https://img.haomeiwen.com/i13717038/842d311f1584c0dc.png)
3、 exchange模型
1 .发布订阅
![](https://img.haomeiwen.com/i13717038/17fd6abb219d8e13.png)
发布订阅和简单的消息队列区别在于,发布订阅会将消息发送给所有的订阅者,而消息队列中的数据被消费一次便消失。所以,RabbitMQ实现发布和订阅时,会为每一个订阅者创建一个队列,而发布者发布消息时,会将消息放置在所有相关队列中。
exchange type = fanout
![](https://img.haomeiwen.com/i13717038/e86cc552881b9451.png)
![](https://img.haomeiwen.com/i13717038/e688c025a4210df8.png)
2 .关键字发送
![](https://img.haomeiwen.com/i13717038/4a28e6d05fd1ed1b.png)
之前事例,发送消息时明确指定某个队列并向其中发送消息,RabbitMQ还支持根据关键字发送,即:队列绑定关键字,发送者将数据根据关键字发送到消息exchange,exchange根据 关键字 判定应该将数据发送至指定队列。
exchange type = direct
![](https://img.haomeiwen.com/i13717038/87ba1bd095d12963.png)
3 .模糊匹配
![](https://img.haomeiwen.com/i13717038/49ddc72cac0dfd10.png)
exchange type = topic
![](https://img.haomeiwen.com/i13717038/4ebb2ea23df92bfb.png)
在topic类型下,可以让队列绑定几个模糊的关键字,之后发送者将数据发送到exchange,exchange将传入”路由值“和 ”关键字“进行匹配,匹配成功,则将数据发送到指定队列。
# 表示可以匹配 0 个 或 多个 单词
* 表示只能匹配 一个 单词
![](https://img.haomeiwen.com/i13717038/bcb3f7abfdeeb24e.png)
4、 基于rabbitMQ的RPC
1 .Callback queue 回调队列
一个客户端向服务器发送请求,服务器端处理请求后,将其处理结果保存在一个存储体中。而客户端为了获得处理结果,那么客户在向服务器发送请求时,同时发送一个回调队列地址 reply_to。
2 .Correlation id 关联标识
一个客户端可能会发送多个请求给服务器,当服务器处理完后,客户端无法辨别在回调队列中的响应具体和那个请求时对应的。为了处理这种情况,客户端在发送每个请求时,同时会附带一个独有correlation_id属性,这样客户端在回调队列中根据correlation_id字段的值就可以分辨此响应属于哪个请求。
客户端发送请求:
某个应用将请求信息交给客户端,然后客户端发送RPC请求,在发送RPC请求到RPC请求队列时,客户端至少发送带有reply_to以及correlation_id两个属性的信息
服务端工作流:
等待接受客户端发来RPC请求,当请求出现的时候,服务器从RPC请求队列中取出请求,然后处理后,将响应发送到reply_to指定的回调队列中
客户端接受处理结果:
客户端等待回调队列中出现响应,当响应出现时,它会根据响应中correlation_id字段的值,将其返回给对应的应用
服务端
![](https://img.haomeiwen.com/i13717038/0c24358d5ca9fd38.png)
客户端
![](https://img.haomeiwen.com/i13717038/28433dd0d789ec45.png)
网友评论