什么是消息中间件?
消息中间件我们平时也经常看到提到,那么到底什么是消息中间件?通过查阅资料,并没有发现有标准的定义.
一般我们可以理解为消息传送机制/传送队列,用作数据交流
为什么要用消息中间件?
消息中间件一般是为了解决分布式系统中的消息传递问题.
一般在电商场景下,用户下单库存,调用物流系统,系统交互,都可以使用RPC(远程过程调用)来进行解决.
但是如果有几十个接口需要调用,就要交给消息中间件了
和 RPC 有什么区别
- 依赖:
比如短信服务,邮件服务,并不是一个交易环节所必须的强依赖,这个时候就应该使用消息中间件. - 非即时:
再比如统计系统,统计业务量,数据量,访问量,并不需要即时,可以使用消息中间件
消息中间件的使用场景
异步处理:
用户注册(50ms)时,发送短信(50ms)和邮件(50ms).
这个时候总时间就是150ms,如果采用并行模式,可能100ms可以完成.
消息中间件:用户注册(50ms)->通知消息中间件(5ms)->发送邮件/短信应用解耦:
订单系统->库存系统(强耦合)
消息中间件: 订单系统->消息中间件->库存系统流量的削峰(秒杀场景)
应用的前端加入消息队列:用户请求->消息队列->秒杀应用日志系统:
错误日志->消息队列->日志处理
用户行为日志->消息队列(kafka)->日志的存储或流式处理纯粹的消息通讯
消息中间件的历史
TIB->IBM MQ->WebSphereMQ->MSMQ
上面这些历史非常早,但都是商用,应用在大型金融企业,非常昂贵,不适合初创的互联网企业
->JMS->AMQP
2001年提出JMS(开源),只能应用于JAVA程序,有很多缺陷,主要实现有ActiveMQ等
2007年提出AMQP(开源),主要实现有RabbitMQ等
后来LinkedIn开源了Kafka,阿里开源了RocketMQ,都是基于分布式,可用性高,理论上不会丢失.
什么是 JMS(Java Messaging Service)规范?
本质是 api,适用于 Java 平台上的面向消息中间件的规范,从设计开始就是为了 Java 应用程序之间进行消息交换,提供一个标准接口来进行企业开发.
JMS 对象模型包含以下几个要素
- 连接工厂: 创建一个 JMS 连接
- JMS 连接: 客户端和服务端之前的一个连接
- JMS 会话: 客户和服务器会话的状态,建立在连接之上的
- JMS 目的: 消息队列
- JMS 生产者: 消息的生成
- JMS 消费者: 接收消息
- Broker: 消息中间件的实例(ActiveMQ)
JMS 的消息模型
- 点对点模式
队列中,一个消息只有一个消费者(即使有多个接收者监听队列)能拿到消息,消费者拿到消息后需要向队列应答成功.如果想让每一个消息都被处理到,应该使用该模式. - 主题(发布订阅)模式
发布到 topic 的消息,会被当前主题的所有订阅者消费