消息队列
消息队列带来的好处
- 通过异步处理提高系统性能(减少响应所需时间)
- 削峰/限流
- 降低系统耦合性
消息队列有哪些问题?
- 降低系统可用性。引入MQ之后,需要考虑消息丢失或者说MQ挂掉等等情况。
- 系统复杂性提高。引入MQ之后,需要考虑消息重复消费、消息丢失、顺序消费等问题
- 一致性问题。需要保证消息被真正消费到。
JMS
定义
JMS(Java Message Service)是java的消息服务,JMS的客户端之间可以通过JMS服务端进行异步的消息传输。JMS API是一个消息服务d额标准或者说是规范。
ActiveMQ(已淘汰)是基于JMS规范实现。
JMS支持的消息类型
- StreamMessage:Java 原始值的数据流
- MapMessage:一套名称-值对
- TextMessage:一个字符串对象
- ObjectMessage:一个序列化的 Java 对象
- BytesMessage:一个字节的数据流
JMS的两种消息模式
- 点对点(P2P)模型:一对一,使用队列作为消息通信的载体。
- 发布/订阅模式:一对多,使用主题作为消息通信载体。
AMQP
定义
AMQP(Advanced Message Queue Protocol)一个提供统一消息服务的应用层标准高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准,兼容JMS,基于此协议的客户端与消息中间可传递消息,并不受不同客户端、中间件、开发语言等条件限制。
AMQP支持的消息类型
- byte[](二进制)
AMQP提供5种消息模式
- direct exchange
- fanout exchange
- topic change
- headers exchange
- system exchange
消息模型
在RocketMQ中使用得是主题模式。
主题模型、发布订阅模型
在主题模型中,消息生产者被称为发布者(Publisher),消息消费者被称为订阅者(Subscriber),存放消息的容器称为主题(Topic)。
队列模型
队列模型就是单纯使用队列作为消息载体,一个消费者绑定一个队列,生产者向队列发送消息,消费者从队列获取消息。这种模式下,如果要实现将消息广播给多个消费者,则需要复制出多个队列,每个队列绑定一个消费者,生产者需向多个队列发送相同的消息。
创建多个队列并且复制多份消息是会很影响资源和性能的。
消息队列中间件
Kafka
Kafka 是 LinkedIn 开源的一个分布式流式处理平台,已经成为 Apache 顶级项目,早期被用来用于处理海量的日志,后面才慢慢发展成了一款功能全面的高性能消息队列。
流式处理平台具有三个关键功能:
- 消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是 Kafka 也被归类为消息队列的原因。
- 容错的持久方式存储记录消息流: Kafka 会把消息持久化到磁盘,有效避免了消息丢失的风险。
- 流式处理平台: 在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库。
RabbitMQ
RocketMQ 是阿里开源的一款云原生“消息、事件、流”实时数据处理平台,借鉴了 Kafka,已经成为 Apache 顶级项目。
RocketMQ
RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。
Pulsar
Pulsar 是下一代云原生分布式消息流平台,最初由 Yahoo 开发 ,已经成为 Apache 顶级项目。
Pulsar 集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性,被看作是云原生时代实时消息流传输、存储和计算最佳解决方案。
ActiveMQ
目前已经被淘汰
对比
| 对比方向 | 概要 |
|---|---|
| 吞吐量 | 万级的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。 |
| 可用性 | 都可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 Kafka 也是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 |
| 时效性 | RabbitMQ 基于 Erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级,其他几个都是 ms 级。 |
| 功能支持 | Pulsar 的功能更全面,支持多租户、多种消费模式和持久性模式等功能,是下一代云原生分布式消息流平台。 |
| 消息丢失 | ActiveMQ 和 RabbitMQ 丢失的可能性非常低, Kafka、RocketMQ 和 Pulsar 理论上可以做到 0 丢失。 |