0%

消息中间件

什么是消息中间件?

消息中间件我们平时也经常看到提到,那么到底什么是消息中间件?通过查阅资料,并没有发现有标准的定义.
一般我们可以理解为消息传送机制/传送队列,用作数据交流

为什么要用消息中间件?

消息中间件一般是为了解决分布式系统中的消息传递问题.
一般在电商场景下,用户下单库存,调用物流系统,系统交互,都可以使用RPC(远程过程调用)来进行解决.
但是如果有几十个接口需要调用,就要交给消息中间件了

和 RPC 有什么区别

  1. 依赖:
    比如短信服务,邮件服务,并不是一个交易环节所必须的强依赖,这个时候就应该使用消息中间件.
  2. 非即时:
    再比如统计系统,统计业务量,数据量,访问量,并不需要即时,可以使用消息中间件

消息中间件的使用场景

  1. 异步处理:
    用户注册(50ms)时,发送短信(50ms)和邮件(50ms).
    这个时候总时间就是150ms,如果采用并行模式,可能100ms可以完成.
    消息中间件:用户注册(50ms)->通知消息中间件(5ms)->发送邮件/短信

  2. 应用解耦:
    订单系统->库存系统(强耦合)
    消息中间件: 订单系统->消息中间件->库存系统

  3. 流量的削峰(秒杀场景)
    应用的前端加入消息队列:用户请求->消息队列->秒杀应用

  4. 日志系统:
    错误日志->消息队列->日志处理
    用户行为日志->消息队列(kafka)->日志的存储或流式处理

  5. 纯粹的消息通讯

消息中间件的历史

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 对象模型包含以下几个要素

  1. 连接工厂: 创建一个 JMS 连接
  2. JMS 连接: 客户端和服务端之前的一个连接
  3. JMS 会话: 客户和服务器会话的状态,建立在连接之上的
  4. JMS 目的: 消息队列
  5. JMS 生产者: 消息的生成
  6. JMS 消费者: 接收消息
  7. Broker: 消息中间件的实例(ActiveMQ)

JMS 的消息模型

  • 点对点模式
    队列中,一个消息只有一个消费者(即使有多个接收者监听队列)能拿到消息,消费者拿到消息后需要向队列应答成功.如果想让每一个消息都被处理到,应该使用该模式.
  • 主题(发布订阅)模式
    发布到 topic 的消息,会被当前主题的所有订阅者消费