Message Queue 消息队列概述
MQ(Message Queue)消息队列,直白定义为把要传输的数据消息放在队列中。
- 把数据放到消息队列叫做生产者
- 从消息队列中取数据叫做消费者
优点:
- 降低系统耦合性 —— 解耦;
- 异步处理提高系统性能 —— 减少响应所需时间;
- 削峰&限流。
缺点:
- 系统可用性降低;
- 系统复杂度提高;
- 一致性问题。
JMS规范
JMS(Java Message Service Java消息服务)JMS API是消息服务的标准OR规范,ActiveMQ就是基于JMS规范实现的。
JMS消息模式:
- 点对点模式(P2P)使用队列(Queue)作为消息通信载体,满足生产者和消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直至被消费或超时;
- 发布、订阅模式(Pub/Sub)使用主题(Topic)作为消息通信载体,类似广播模式,生产者分布一条消息,该消息会通过主题传递给所有的消费者。
JMS消息类型:
- StreamMessage:数据流消息
- MapMessage:键值对消息
- TextMessage:字符串消息
- ObjectMessage:Java对象消息
- BytesMessage:字节流消息
AMQP协议
AMQP(Advanced Message Queuing Protocol 高级消息队列协议)是一个提供统一消息服务的应用层标准高级消息队列协议,为面向消息的中间件设计,兼容 JMS。基于此协议的客户端与消息中间件可传递消息,并不受客户端或中间件同产品和不同的开发语言等条件的限制。RabbitMQ 就是基于 AMQP 协议实现的。
AMQP消息模型:
- direct exchange
- fanout exchange
- topic exchange
- headers exchange
- system exchange
AMQP消息类型:
- byte[](二进制)
常用消息中间件概述及对比
ActiveMQ
RabbitMQ
RocketMQ
Kafka
消息中间件 | 吞吐量 | 可用性 | 时效性 | 功能支持 | 消息丢失 | 支持协议 | 支持语言 | 持久化 | 社区活跃&商业化 | 推荐指数 |
---|---|---|---|---|---|---|---|---|---|---|
ActiveMQ | 万级 | 主从高可用 | 毫秒级(ms) | MQ功能完备 | 可能性很低 | JMS规范实现&可插拔的协议支持 | 多语言支持 | ❤ | ||
RabbitMQ | 十万级 | 主从高可用 | 微秒级(ws) | MQ功能完备 | 可能性很低 | AMQP协议实现&支持多协议 | 多语言支持 | ❤❤❤ | ||
RocketMQ | 百万级 | 分布式高可用 | 毫秒级(ms) | MQ功能完备 | 理论上不会 | 基于Java实现 | 支持Java | 阿里云 | ❤❤ | |
Kafka | 百万级 | 分布式高可用 | 毫秒级(ms) | MQ功能简单,大数据领域实时计算&日志采集 | 理论上不会 | 基于Scala实现的一个高性能分布式Publish/Subscribe消息队列系统 | 磁盘 | ❤❤ |
消息中间件常见问题处理
高可用方案
- ActiveMQ 和 RabbitMQ 为主从高可用(以RabbitMQ为例阐述主从高可用)
RabbitMQ支持单机、普通集群和镜像集群三总部署模式,只有镜像集群模式才是高可用模式。在镜像集群模式下,你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,也就是说,每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 上。
如何开启RabbitMQ镜像集群模式?
RabbitMQ 有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。
不足之处:
1.性能开销大,消息需要同步到所有机器上,导致网络带宽压力和消耗很重;
2.无实现线性扩展。
- RocketMQ 和Kafka 通过分布式实现高可用(以Kafka为例阐述分布式高可用)
Kafka由多个 broker 组成,每个 broker 是一个节点;你创建一个 topic,这个 topic 可以划分为多个 partition,每个 partition 可以存在于不同的 broker 上,每个 partition 就放一部分数据。
防消息丢失
防重复消费
消费顺序性
过期失效
参考资料:消息中间件面试题
TODO:具体深入学习各常用消息中间件 20190808