JMS&AMQP 简介|学习笔记

简介: 快速学习 JMS&AMQP 简介

开发者学堂课程【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、异步处理

image.png

异步处理示意图

以某个用户注册为例,用户注册成功以后,我们将他的注册信息写进数据库,同时还想给他发一封邮件和一条短信。

首先我们采用同步调用的方法,写完数据库后去调发邮件,再去调发短信,每次调用需要50毫秒,共需150毫秒去响应给用户,这个过程十分漫长。第二种模式是用户注册信息写进数据库花费50毫秒,通过多线程的方式,并发执行两个操作,第一个操作用来发送注册邮件,第二个操作用来发送短信。

由于是并发,相当于只花了一个最长的时间来完成两个操作,共需100毫秒去响应给用户,而这还不是最优方案。此时引入消息队列,这样用户将注册好的信息写进数据库以后,只需将相关信息很快的写进消息队列,一旦写入了消息队列立马返回,用户即可在60毫秒内即可得到响应。

2、应用解耦

image.png

应用解耦示意图

例如将订单系统与库存系统写在一个应用里耦合起来,下完单后我们需要减库存,则在下完单后就需要去调取减少库存的方法,这样的操作很麻烦并且耗时很久。若将订单系统和库存系统单独抽取出来,当我们下单时,下单的信息就会写进我们消息队列里,库存系统通过订阅消息队列里的内容,进行计算库存相关的操作,可以提供效率。

3、流量削峰

image.png

流量削峰特别适用于秒杀,比如有10万个人抢购1万个商品,每个人都发送一个请求进来,处理起来十分麻烦而且会导致卡顿。

如果用户的秒杀请求进来后直接进入消息队列,并将消息队列设置定成为1万个,即它只能存储1万个数据,10万个用户中只有前1万个可以进入,后边的9万个用户无法进入消息队列,只要进不了队列立马抛弃请求,响应显示为秒杀失败。

相关文章
|
5月前
|
消息中间件 Java
Java一分钟之-RabbitMQ:AMQP协议实现
【6月更文挑战第11天】RabbitMQ是基于AMQP协议的开源消息队列服务,支持多种消息模式。本文介绍了RabbitMQ的核心概念:生产者、消费者、交换器、队列和绑定,以及常见问题和解决方案。例如,通过设置消息持久化和确认机制防止消息丢失,配置死信队列处理不可消费消息,以及妥善管理资源防止泄漏。还提供了Java代码示例,帮助读者理解和使用RabbitMQ。通过理解这些基础和最佳实践,可以提升RabbitMQ在分布式系统中的可靠性和效率。
123 0
Java一分钟之-RabbitMQ:AMQP协议实现
|
5月前
|
消息中间件 Oracle Java
ActiveMQ –JMS开源框架入门介绍
ActiveMQ –JMS开源框架入门介绍
49 0
|
消息中间件 Java 数据库连接
03JMS简介
03JMS简介
52 0
|
消息中间件 存储 Java
【图解RabbitMQ-2】图解JMS规范与AMQP协议是什么
【图解RabbitMQ-2】图解JMS规范与AMQP协议是什么
135 0
|
消息中间件 搜索推荐 Java
消息中间件JMS介绍、入门demo与spring整合
消息中间件JMS介绍、入门demo与spring整合
363 7
消息中间件JMS介绍、入门demo与spring整合
|
消息中间件 Java 物联网
AMQP-RabbitMQ/1/概念/一对一简单模型
JMS,AMQP,MQTT的区别与联系 JMS Java消息传递服务(Java Messaging Service ) AMQP 高级消息队列协议(Advanced Message Queueing Protocol ) MQTT消息队列遥测传输(Message Queueing Telemetry Transport ) 简单理解:*JMS是专门为Java设计的一套消息服务API,像ActiveMQ就是对它的实现*AMQP为了解决不同平台之间的通信问题,定义了一种名为amqp的通信协议,从而实现平台和语言无关性。
1202 0
|
Web App开发 消息中间件 Java
轻松搞定RabbitMQ开篇:Java消息队列与JMS的诞生
Java 帝国之消息队列 原创: 刘欣 码农翻身 2017-02-06 张家村的历史 Java 帝国的张家村正在迎来一次重大的变革。
|
消息中间件 Java API
深入浅出JMS(一)--JMS基本概念
摘要:The Java Message Service (JMS) API is a messaging standard that allows application component...
1304 0