1:概念整理
1.1:应用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景
1.2:使用较多的消息队列有:ActiveMQ, RabbitMQ, Kafka(专供大数据的)
这三个执行速度 kafka最快,其次是rabbitMq,最慢的是activityMq;
最安全的是activityMq,然后是rabbitMq,最后是kafka;
也就是谁快,谁就不安全,哪一个慢,就越安全;
一般我们都选择rabbitMq。
1.3:重要关键词
RoutingKey:(Routing-路由)
是消息队列的key值;就是我的消息队列有123456啊,每一个都得有一个唯一标识。
那么我这个交换器如何去连这个队列呢?它就是用过这个RoutingKey来连接。
2:安装
2.1:windows下安装RabbitMQ
步骤:
1:下载并安装 eralng
由于RabbitMQ依赖Erlang, 所以需要先安装Erlang。直接下一步下一步就可以了;
2:下载并安装rabbitmq
双击安装,注意不要安装在包含中文和空格的目录下!安装后window服务中就存在rabbitMQ了,并且是启动状态
3:安装管理页面(插件)
因为rabbitmq他自身是提供了管理界面的。
进入rabbitMQ安装目录的sbin目录,输入命令
rabbitmq‐plugins enable rabbitmq_management
4:重新启动服务
5:打开浏览器,地址栏输入http://127.0.0.1:15672 ,即可看到管理界面的登陆页
输入用户名和密码,都为guest 进入主界面
最上侧的导航以此是:概览、连接、信道、交换器、队列、用户管理
这个管理界面中对我们有用的就是交换器和队列,其他的是他自己内部的一些监控,不用管。
Exchange:我们要往队列中发消息是要经过交换器的。
Queue:(队列)是RabbitMQ的内部对象,用于存储消息。
添加队列的一些关键词:
Durability:是否做持久化 Durable(持久)
transient(临时)
Auto delete : 是否自动删除
3:三种模式
直接模式-direct
分裂模式-fanout
主题模式-topic
直接模式:我们需要将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式;其实就是点对点
可以理解直接模式就是没有用交换器(也可以这样理解)
分裂模式:当我们需要将消息一次发给多个队列时,需要使用这种模式。就是一对多
每次固定的往所有的队列里面发,是所有的队列。
主题模式:我们可以认为主题模式是分裂模式的一个加强版;
可以选择性的往某一个,或者某两个队列里面去发,就是靠RoutingKey。
接下来就是写几个简单的demo,来测试下这几个模式
我用的是springboot整合rabbitMq,因此这块写上我的步骤:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
直接模式demo:
@RunWith(SpringRunner.class)
@SpringBootTest(classes=RabbitMqApplication.class)
public class ProductTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSend(){
rabbitTemplate.convertAndSend("test","直接模式测试");
}
}
在图形管理界面,直接新建一个队列,名称叫test
点击单元测试,即可在控制台看到打印结果。
分裂模式demo:
其实分列模式就是建立队列的时候,在建立一个交换器,并且把交换器绑定到这些队列(不指定RouteKey),
发送到绑定的所有队列。
主题模式:
主题模式和分裂模式的区别不大,只不过他绑定的时候多了一个匹配这个rountingkey的规则。
就是类似于mysql中的模糊匹配。
交换器说到底是一个名称与队列绑定的列表。
当消息发布到交换器时,实际上是由你所连接的信道,将消息路由键同交换器上绑定的列表进行比较,最后路由消息。
如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息。