同步调用的优点:
-
时效性较强,可以即得到结果
同步调用的问题:
-
耦合度高
-
性能和吞吐能力下降
-
有额外的资源消耗
-
有级联失败问题
-
耦合度低
-
吞吐量提升
-
故障隔离
-
流量小削峰
异步通信的缺点
-
依赖于Broker的可靠性,安全性,吞吐能力
-
架构复杂了,业务没有明显的流程线,不好追踪管理
MQ(MessageQueue)
-
消息队列,字面来看就是存放消息的队列,也就是事件驱动架构中的Broker
-
RabbitMQ
-
RabbitMQ是基于Erlang语言开发的开源消息中间件
RabbitMQ的几个概念
-
channel :操作MQ的工具
-
exchange : 路由消息到队列中
-
queue : 缓存消息
-
virtual host : 虚拟主机,是对queue,exchange等资源的逻辑分组
简单队列模型
-
基本消息队列的消息发送流程
-
建立connection
-
创建channel
-
利用channel声明队列
-
利用channel向队列发送消息
-
-
基本消息队列的消息接收流程
-
建立connection
-
创建channel
-
利用channel声明队列
-
定义consumer的消费行为handleDelivery()回调函数
-
利用channel将消费者与队列绑定
-
Spring AMQP
-
AMQP : 应用间消息通信的一种协议,与语言和平台无关
-
Spring AMQP 是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息。包含两部分,其中spring-amqp是基础抽象,spring-rabbit是底层的默认实现
-
SpringAMQP发送消息的步骤
-
引入amqp的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency> -
配置RabbitMQ地址
spring
-
利用RabbitTemplate的convertAndSend方法
package cn.itcast.mq.springMq;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
-
-
SpringAMQP接收消息的步骤
-
引入amqp的依赖
-
配置RabbitMQ地址
-
编写接收类
package cn.itcast.mq.listen;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
-
Work Queue
-
Work Queue 工作队列 ,可以提高消息处理速度,避免队列消息堆积
-
多个消费者绑定到一个队列,同一个消息只会被一个消费者处理
-
通过设置prefetch来控制消费者预取的消息数据量
发布(Publish),订阅(Subscribe)
-
允许将同一消息发送给多个消费者,实现方式是加入exchange(交换机)
-
exchange:
-
广播 Fanout
-
路由 Direct
-
话题 Topic
-
FanoutExchange
package cn.itcast.mq.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
总结:
-
交换机的作用:
-
接收publisher发送的消息
-
将消息按照规则路由到与之绑定的队列
-
不能缓存消息,路由失败,消息丢失
-
FanoutExchange的会将消息路由到每个绑定的队列
-
-
声明队列,交换机,绑定关系的Bean是什么?
-
Queue
-
FanoutExchange
-
Binding
-
DirectExchange
//direct
//Direct
TopicExchange
//Topic
//Topic
消息转换器
-
SpringAMQP中的消息的序列化和反序列化是怎么实现的?
-
利用MessageConverter实现的,默认是JDK的序列化方式
-
注意发送方和接收方必须使用相同的MessageConverter
-
消息是object,可以接受任意消息,,例对象
-
pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
Jackson 转换: MessageConverter
//object
//object
//object
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话