一.同步通讯
1.缺点:耦合度高、性能下降、浪费资源、级联失败
2.因为一个底层服务崩溃,最终导致整个集群不可用的情况,我们称之为:服务雪崩;这种只有微服务架构才会出现的问题
二.异步通讯
1.服务之间的调用要有一个Broker(订阅),只要哪个服务来订阅,一但有更新就知道
2.优点:降低耦合、提高性能、故障隔离
3.缺点:依赖Broker的可靠性、安全性、吞吐性;架构复杂了,没有明显的流线程,不好追踪管理
三.消息队列(MQ)
1.RabbitMQ(Rabbit公司)、ActiveMQ(Apache)、RocketMQ(阿里)、Kafka(Apache)
2.吞吐量比较大的用Kafka(收费的)、一般市面上用的最多的是RabbitMQ
四.RabbitMQ的环境搭建
1.先拉取rabbitMQ----》docker pull rabbitmq:3.8-management
2.安装-----》docker run \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management
五.RabbitMQ快速入门
1.exchange只做消息的分发,不做消息的存储;路由消息到队列中
2.queue(队列):缓存消息
3.基本消息队列是直接到队列,不经过交换机;一对一
4.工作消息队列是直接到队列,不经过交换机;一对多
5.发布订阅分为三种:
1.广播(Fanout)----》经过exchange的分发
2.路由(Direct)----》有指定的关键词,指定要分发到哪个
3.主题(Topic)----》可以匹配多个带*
六.消息发送
1.创建通道
2.创建队列
3.发送消息
七.消息接收
1.创建通道
2.创建队列
3.发送消息
八.SpringAMQP
1.利用RabbitTemplate的convertAndSend方法来发送消息
2.基本消息队列
3.工作队列(一对多,防止消息挤压)
能者多劳
4.发布订阅【广播】(先发送给交换机,再路由给队列)
在消费方声明配置类。来声明交换机、队列、绑定关系
交换机返回的Bean是FanoutExchange、队列返回的Bean是Queue、绑定返回的Bean是Binding
5.路由
每个队列和交换机都设置一个BinDingKey
6.主题
#代表0个或多个单词,*代表一个单词
高级篇
一.消息的可靠性
1.发送时丢失:生产者发送的消息没有到交换机、消息到达交换机但没有到队列
2.MQ宕机了:队列将消息丢失
3.消费者接收到消息后未消费就宕机了
二.生产者消息确认
1.RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程丢失
2.publisher-confirm发送消息成功投递到交换机返回ack,否则返回nack
3.publisher-return消息投递到交换机了但是没有路由到队列,返回ACK,以及路由失败原因
4.配置文件
5.定义一个配置类实现ApplicationContextAware
6.从spring容器获取RabbitTemplate
7.设置returnCallback
8.发送消息体
9.添加confirm-callback函数
三.持久化
1.交换机持久化
2.队列持久化
四.消费者确认
1.manual(手动):
2.auto(自动):由spring监测listener代码是否出现异常,没有异常则返回ack,抛出异常返回nack
3.none(关闭):