概述
- 消息队列是分布式系统的主要组件
- 主要优势:
- 通过异步处理提高系统性能(1、削峰,通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务;2、减少响应所需时间)
- 降低系统耦合性(消息发送者和消息接受者之间没有直接耦合,新增业务只要对该消息感兴趣即可订阅)
- 问题:
- 系统可用性降低(需要考虑消息丢失、MQ挂掉等)
- 系统复杂度提升(保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等)
- 一致性问题(消息的真正消费者并没有正确消费消息)
组成
- Broker
消息服务器,作为server提供消息核心服务 - Producer
消息生产者,业务的发起方,负责生产消息传输给broker - Consumer
消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理 - Topic
主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播 - Queue
队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收 - Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
模式
- 点对点
使用queue作为通信载体 - Pub/Sub发布订阅
使用topic作为通信载体
协议
协议 | 特点 | 优势 |
---|---|---|
AMQP协议 | 提供统一消息服务的应用层标准高级消息队列协议 | 可靠、通用 |
MQTT协议 | IBM开发的一个即时通讯协议 | 格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统 |
STOMP协议 | 流文本定向消息协议 | 命令模式(非topic\queue模式) |
XMPP协议 | 基于可扩展标记语言(XML)的协议 | 通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大 |
其他基于TCP/IP自定义的协议 | 基于TCP\IP自行封装了一套协议,通过网络socket接口进行传输,实现了MQ的功能 |
消息中间件
- 老牌的ActiveMQ
- RabbitMQ
- 炙手可热的Kafka
- 阿里巴巴自主开发RocketMQ
多语言支持 | |||
---|---|---|---|
RocketMQ | 阿里参照kafka设计思想自主开发 | 能够保证严格的消息顺序;提供针对消息的过滤功能;提供丰富的消息拉取模式;高效的订阅者水平扩展能力;实时的消息订阅机制;亿级消息堆积能力 | 只支持java |
RabbitMQ | 支持AMQP,XMPP, SMTP,STOMP等协议;实现了Broker架构 | 语言无关 | |
ActiveMQ | Apache下,少量代码实现应用 | 支持,java优先 | |
redis | 本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用 | 入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。 | |
Kafka | Apache下,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统 | 快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化;高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;高堆积:支持topic下消费者较长时间离线,消息堆积量大;完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡;支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。 | 支持,java优先 |
ZeroMQ | 高吞吐量/低延迟的场景 | ZeroMQ仅提供非持久性的队列,如果down机,数据将会丢失 |