一、 为什么使用消息中间件?
假设用户登录系统 传统方式 用户登录 调用短息服务 积分服务 日志服务等各种服务 如果短息服务出现问题就无法发送短信而且用户登录成功必须所有调用全部完成返回给用户登录系统一条用户登录成功信息。从整体业务上讲 用户只是要登录系统 并不关心短信服务 日志服务怎么样就想登录成功就好 这种操作让用户等待了时间。
2)通过消息中间件解耦服务调用
用户登录系统会将登录消息发送给消息中间件 ---消息中间件会将用户登录消息异步一条一条推送给---短息服务 日志服务等其他相关服务 用户就不需要等待其他服务处理完成在给我返回结果。
二、 消息中间件的好处:
1)系统解耦
2)异步
3)横向扩展
4)安全可靠 消息中间件会把我们的消息进行保存 如果其他业务系统出现问题 或者业务系统没有对消息进行消费 业务系统可以下一次继续对消息进行消费
5)顺序保存
三、中间件是什么:
中间件作用在业务系统之间 不是操作系统软件 还不是业务软件,用户不能直接使用的软件同一叫法。
四、消息中间件:
用于数据接收和发送,利用高效可靠的异步消息传递机制集成分布式系统
五、JMS (java Message Service )
Java消息服务 java消息中间件的API,用于在两个应用程序之间或者分布式系统中发送消息,进行异步通信的规范。
六、AMQP
提供统一消息服务的应用层标准协议,遵循这个协议客户端与消息中间件可以传递消息,不会受到客户端和中间件不同产品,是不同开发语言影响 只要遵循这种协议就可以传递消息。
七、常见消息中间件
activeMQ 是一个完全支持JMS1.1和J2EE1.4规范的
rabbitMQ 是一个开源的AMQP实现,用于分布式系统中存储转发消息
kafka 是一个高吞吐量的分布式发布订阅消息系统,是一个分布式的,分区的,可靠的分布式日志存储服务。(不是一个严格消息中间件 )
1)高吞吐量:即使非常普通的硬件kafka也可以支持每秒数百万的消息
八、JMS规范
提供者:实现JMS规范的消息中间件服务器
客户端:接收或发送消息的应用程序
生产者/发布者:创建并发送消息的客户端
消费者/订阅者:接收并处理消息的客户端
消息:应用程序之间传递的数据内容
消息模式:在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式
九、JMS消息模式
1)队列模式
客户端包括生产者和消费者
队列中的消息只能被一个消费者消费
消费者可以随时消费队列的消息
举例:生产者 应用1 应用2 向JMS队列中发送消息 应用1发送 1 3 5 应用2 发送2 4 6 JMS消息队列中会存在 1 2 3 4 5 6 消息 时存在消费者 应用3 应用4 应用3与JMS 有两个链接 应用4有一个链接 在消费消息的时候 三个链接会平均分配6各消息
2)主题模式
客户端:包括发布者和订阅者
主题中的消息被所有订阅者消费
消费者不能消费订阅之前就发送到主题中的消息(消费者要消费队列中的消息要先订阅在消费 如果不提前订阅是接收不到消息的)
举例:应用3 与应用4 向队列中订阅消息 应用3建立了两个链接 应用4建立了一个链接 发布者 应用1 应用2 向队列中发布消息 123456 当订阅者消费消息的时候三个链接都消费了6个消息
十、JMS编码接口
ConnectionFactory 用于创建链接到消息中间件的链接工厂
Connection 代表可应用程序和消息服务器之间的通信链路
Destination (目的地) 指消息发布和接收的地点,包括队列和主题
Session 表示一个单线程的上下文,用于发送和接收消息
MessageConsumer 由会话创建,用于接收发送到目标的消息
MessageProducer 由会话创建,用于发送消息到目标
Message 是在消费者和生产者之间传送的对象,消息头,一组消息属性,一个消息体
十一:JMS代码演示
1)使用JMS接口规范链接activeMQ 队列模式
引入activemq依赖jar 注意:引入相关jar 必须与相应的jdk匹配否则会报异常
1 java.lang.UnsupportedClassV