MQ:MessageQueue,消息队列;
MQ的作用主要有以下三个方面:
异步: 能提供系统的响应速度,吞吐量。
解耦:服务之间进行解耦,才可以减少服务之间的影响。
削峰:以稳定的系统资源应对突发的流量冲击。
常用的MQ有:
RabbitMQ,RocketMQ,Kafka等;
接下来主要学习RabbitMQ;
一:RabbitMQ集群搭建
默认的普通的集群模式:
使用Erlang语言天生具备的集群方式搭建,集群的各个节点之间只会有相同的元数据,即队列结构,而消息不会进行冗余,只存在一个节点中。消费时,如果消费的不算存有数据的节点,RabbitMQ会临时在节点之间进行数据传输,将消息从存有数据的节点传输到消费的节点。
镜像模式:
这种模式是在普通集群模式基础上的一种增强方案,官方HA高可用方案。本质的区别在于,这种模式会在镜像节点中间主动进行消息同步,而不是在客户端拉取消息时临时同步;
搭建普通集群
1.需要同步集群节点中的cookie
默认会在/var/lib/rabbitmq目录下生成一个.erlang.cookie.里面有一个字符串,我们要做的就算保证集群中的三个节点的这个cookie字符串一致。
2.将worker1的服务加入到worker2中的集群中
首先需要保证worker1上的rabbitmq服务正常,然后执行以下指令
[root@worker1 rabbitmq]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@worker1 ...
[root@worker1 rabbitmq]# rabbitmqctl join_cluster --ram rabbit@worker2
Clustering node rabbit@worker1 with rabbit@worker2
[root@worker1 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@worker1 ...
3.然后使用同样的方式将worker3加入到worker2中。
搭建镜像集群
在之前的基础上,就可以继续搭建镜像集群。
1.先创建一个/mirror的虚拟主机,然后再添加给对应的镜像策略:
[root@worker2 rabbitmq]# rabbitmqctl add_vhost /mirror
Adding vhost "/mirror" ...
[root@worker2 rabbitmq]# rabbitmqctl set_policy ha-all --vhost "/mirror" "^"
'{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority
"0" for vhost "/mirror" ...
基础使用
1.虚拟主机 virtual host
2.连接Connection
3.信道Channel:每个信道都会被分配一个唯一的ID,会在一个Connection中建立多个Channel,这样便于客户端进行多线程连接。
4.交换机Exchange
5.队列Queue:实际保存数据的最小单位。FIFO,经典队列Classic. RabbitMQ3.8中添加了Quorum队列,3.9中添加了Stream。
5.1Classic经典队列:
5.2Quorum仲裁队列:Quorum是基于Raft一致性协议实现的一种新型的分布式消息队列
5.3Stream队列:是以append-only只添加的日志来记录消息
SpringBoot集成RabbitMQ
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.使用RabbitmqTemplate对象发送消息
3.使用@RabitListener注解声明消费者