ActiveMQ(为什么要使用消息中间件,JMS传输模型)
为什么要使用消息中间件:
同步请求:当客户端向服务器发送一条请求的时候,此时服务器由于网络,或者处理一些比较大的数据的时候,可能有延迟,客户端 会处于一直等待的状态。只有等待服务器返回处理结果,或者请求超时,客户端才能继续执行
因此可以看出同步请求一些场景上面使用有些弊端:客户与服务器对象的生命周期紧密耦合,客户进程和服务对象进程都都必须正常运行;如果由于服务对象崩溃或者网络故障导致用户的请求不可达,客户会受到异常
在实际项目中有项目 A 它产生了 一系列的数据,需要将该数据存放到数据库,但是如果由A 项目 直接 存放到数据库,可能导致A项目执行变慢,所以想将A 项目产生的数据,交由 B 项目 然后由B 项目提交到数据库,B 提交数据库的时候,不管B 执行的时间或者成功失败,不影响A 的运行
实现这种情况,可以使用消息中间件。
什么是消息中间件:
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。例如:A项目将数据发送给消息服务器,消息服务器将消息存放到队列之中,在合适的时候,消息服务器将消息发送给B 项目
这种模式下,发送和接收是异步的,发送者无需等待; 二者的生命周期未必相同: 发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;
什么是JMS
既然学习消息中间件,用的又是java,所以有必要知道JMS 是什么:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。可以理解成:JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输
JMS可以看成一种技术规范,接口
JMS支持两种消息模型:
点对点消息模型:
消息队列:存放消息(可以看成是一个地址)
生产者:产生消息的一端
消费者:接受消息的一端
生产者将消息发送到队列,消费者从队列中获取消息消费
点对点的特点:
1.生产者生产的消息只能被一个消费者消费,消费成功以后,则将该消息从队列中清除
2.生产者和消费者在时间上面没有什么关联,生产者生产消息的时候,消费者 可以不再,消费者消费消息的时候,不需要关注生产者是否存在
3.接收者在成功接收消息之后需向队列应答成功
发布订阅消息模型:
主题
发布者
订阅者
发布者将消息发布到主题中,订阅者订阅主题(可以有多个订阅者)
发布订阅特点:
1.每个消息可以有多个消费者
2.发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
如何理解 点对点 和点对消费时候的时间关联性:
点对点消息模型:生产者 生产消息存放到队列以后,如果消费者者此时 没有开启,运行。则消息不会被消费,会保存到队列之中,消费者 开启运行以后,则会从队列中拉取消息进行消费,正常情况,这条消息是保证会被消费者消费。
发对订阅:发布者发布消息的时候,订阅者 订阅了主题,还必须保证在运行,如果没有开启运行,则不会消费到这条消息,即使开启运行以后,也没法在消费该消息了。
如何选择JMS 哪种消息模型 进行传输消息:
如果你希望发送的每个消息都应该被成功处理的话,那么你需要点对点模式。
如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用发布/订阅模型
在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。
同步消费:
订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞
异步 消费:
订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。
消息中间件使用场景:
用户注册账号 服务器将数据存入数据库,然后在给用户发送短信或者邮件
设想 可以使用多线程技术:在创建一个线程来负责发送注册邮件,但是 如果发送失败 则没有后续的补偿机制。
此时可以考虑使用 消息中间件
从这样来看,使用消息中间件 可以降低响应的时间。
所以 学习 消息中间件是当前需要掌握的一种技能,消息中间件有很多产品 例如:RabbitMQ,Redis,ActiveMQ,Kafka/Jafka,学习一两种 傍身,讲述ActiveMQ的使用