消息中间件
1. 什么是消息中间件
MQ 全称为 Message Queue,消息队列是应用程序和应用程序之间的通信方法。
在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大节省了服务器的请求响应时间,提高了系统的吞吐量。
1.1 应用场景
-
任务异步处理
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
-
应用程序解耦合
MQ 相当于一个中介,生产方通过 MQ 与消费方交互,它将应用程序进行解耦合。
-
削峰填谷
在并发量高时,产生的交易无法正常处理,导致系统宕机,采用MQ,消息被 MQ 保存起来,系统再按照正常数据量处理,高峰就被“削”掉了,从而避免这种情况。
1.2 JMS和AMQP
MQ 是消息通信的模型;实现 MQ 的大致有两种主流方式:AMQP、JMS。
1.2.1 JMS
JMS 即 Java 消息服务(JavaMessage Service)应用程序接口,是一个Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
1.2.2 AMQP
AMQP 是一种协议,更准确的说是一种 binary wire-level protocol(链接协议)。这是其和 JMS 的本质差别,AMQP 不从 API 层进行限定,而是直接定义网络交换的数据格式。
1.2.3. JMS与AMQP 区别
- JMS 是定义了统一的接口,来对消息操作进行统一;AMQP 是通过规定协议来统一数据交互的格式。
- JMS限定了必须使用 Java 语言;AMQP 只是协议,不规定实现方式,因此是跨语言的。
- JMS规定了两种消息模式;而 AMQP 的消息模式更加丰富。
1.3 消息队列产品
- ActiveMQ:基于 JMS;
- ZeroMQ:基于 C 语言开发;
- RabbitMQ:基于 AMQP 协议,erlang 语言开发,稳定性好;
- RocketMQ:基于 JMS,阿里巴巴产品;
- RocketMQ:基于 JMS,阿里巴巴产品;
- Kafka:类似 MQ 的产品;分布式消息系统,高吞吐量。
RabbitMQ VS kafka 适用场景比较
场景 | RabbitMQ | kafka |
---|---|---|
消息的顺序 | 线程出错,消息重新入队,造成乱序 | 消费者pull模式 |
消息的匹配 | 通配符 | - |
消息的超时 | TTL+死信队列+延迟队列 | - |
消息的保持 | 消息被取出来就被删除,不能重复消费 | offset模型 |
消息的错误处理 | 死信队列+跳过处理 | 不能跳过,只能停止 |
消息的吞吐量 | 每秒几万条消息 | 每秒几十万条 |
其他 | 配置复杂、维护复杂(zookeeper+jvm) |