开发者学堂课程【SpringBoot 快速掌握 - 高级应用:JMS&AMQP 简介】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/613/detail/9298
JMS&AMQP 简介
内容介绍:
一、概述
二、举例说明
一、概述
1、大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力
2.消息服务中两个重要概念
消息代理(message broker)和目的地(destination)。消息代理是消息中间件的服务器,给消息队列存取内容,就要连接服务器。消息发送者将消息发送到消息代理也就是发送到服务器,服务器接管到消息后要把消息传递给指定目的地。
3.消息队列目的地形式
队列(queue):点对点消息通信(point-to-point)
点对点式:消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列。消息只有唯一的发送者和接受者,但并不是说只能有一个接收者
主题(topic):发布(publish)/订阅(subscribe)消息通信
发布订阅式:发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息
4、消息代理规范
JMS (Java Message Service) JAVA 消息服务:基于JVM消息代理的规范。ActiveMQ、HornetMQ 是 JMS 实现
AMQP (Advanced Message Queuing Protocol)高级消息队列协议,也是一个消息代理的规范,兼容 JMS。RabbitMQ 是 AMQP 的实现
两者区别
JMS |
AMQP |
|
定义 |
Java api |
网络线级协议 |
跨语言 |
否 |
是 |
跨平台 |
否 |
是 |
Model |
提供两种消息模型: (1)peer-2-peer (2)pub/sub |
提供了五种消息模型: (1)direct exchange (2)fanout exchang (3)topic change (4)headers exchange (5)system exchange 本质上来讲,后四种和JMS 的 pub/sub 模型没有太大差别,仅是在路由机制上做了更详细的划分; |
支持消息类型 |
多种消息类型: lextMessage MapMessage BytesMessage StreamMessage ObjectMESSAGE Message(只有消息头和属性) |
bytel 当实际应用时,有复杂的消息,可以将消息序列化后发送 |
综合评价 |
JMS 定义了 JAVAAPI层面的标准;在 java 体系中,多个 client 均可以通过 MS 进行交互,不需要应用修改代码,但是其对跨平台的支持较差; |
AMQP 定义了 wrie-level层的协议标准;天然具有跨平台、跨语言特性。 |
5. Spring 支持
spring-jms 提供了对 JMS 的支持。
spring-rabbit 提供了对 AMQP 的支持。
需要 ConnectionFactory 的实现来连接消息代理。
提供 JmsTemplate、RabbitTemplate 来发送消息。
@JmsListener (JMs)、@RabbitListener (AMQP)注解在方法上监听消息代理发布的消息。
EnableJms、@EnableRabbit 开启支持。
6. Spring Boot 自动配置
JmsAutoConfiguration
RabbitAutoConfiguration
二、举例说明
1、异步处理
异步处理示意图
以某个用户注册为例,用户注册成功以后,我们将他的注册信息写进数据库,同时还想给他发一封邮件和一条短信。
首先我们采用同步调用的方法,写完数据库后去调发邮件,再去调发短信,每次调用需要50毫秒,共需150毫秒去响应给用户,这个过程十分漫长。第二种模式是用户注册信息写进数据库花费50毫秒,通过多线程的方式,并发执行两个操作,第一个操作用来发送注册邮件,第二个操作用来发送短信。
由于是并发,相当于只花了一个最长的时间来完成两个操作,共需100毫秒去响应给用户,而这还不是最优方案。此时引入消息队列,这样用户将注册好的信息写进数据库以后,只需将相关信息很快的写进消息队列,一旦写入了消息队列立马返回,用户即可在60毫秒内即可得到响应。
2、应用解耦
应用解耦示意图
例如将订单系统与库存系统写在一个应用里耦合起来,下完单后我们需要减库存,则在下完单后就需要去调取减少库存的方法,这样的操作很麻烦并且耗时很久。若将订单系统和库存系统单独抽取出来,当我们下单时,下单的信息就会写进我们消息队列里,库存系统通过订阅消息队列里的内容,进行计算库存相关的操作,可以提供效率。
3、流量削峰
流量削峰特别适用于秒杀,比如有10万个人抢购1万个商品,每个人都发送一个请求进来,处理起来十分麻烦而且会导致卡顿。
如果用户的秒杀请求进来后直接进入消息队列,并将消息队列设置定成为1万个,即它只能存储1万个数据,10万个用户中只有前1万个可以进入,后边的9万个用户无法进入消息队列,只要进不了队列立马抛弃请求,响应显示为秒杀失败。