之前写的博客太杂,最近想把RocketMQ的知识点再系统的过一遍,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点可以参考之前写的一些博客,这篇不再赘述。
SpringCloud入门(3) RabbitMQ
RocketMQ学习(1) 快速入门
RocketMQ学习(2) 深入学习
RocketMQ学习(3) 秒杀实战
MQ技术对比
现在开源软件或云平台上 Broker 的软件是非常成熟的,比较常见的一种就是我们今天要学习的MQ技术。MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。
几种常见MQ的对比:
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社区 | Rabbit | Apache | 阿里 | Apache |
开发语言 | Erlang | Java | Java | Scala&Java |
协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 |
可用性 | 高(主从架构) | 一般(主从架构) | 非常高(分布式架构) | 非常高(主从架构) |
单机吞吐量 | 一般(万级) | 差(万级) | 高(十万级) | 非常高(十万级) |
消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
消息可靠性 | 高 | 一般 | 高 | 一般 |
功能特性 | 基于erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富 | 成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好 | MQ功能比较完备,扩展性佳 | 只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广 |
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
可以看到没有一个相对完美的解决方案,每种方案都有一些优点和缺点,国内用的比较多的还是RabbitMQ、RocketMQ和Kafka,因为Kafka的吞吐能力见长稳定性较差可靠性较低,所以适合海量数据的传输但是对于数据安全要求不高的,比如说日志消息传输。
而RabbitMQ和RocketMQ稳定性更强可靠性更高,吞吐量也不是特别的差,所以更适合用于对稳定性要求较高的,比如说业务之间的这种通信,而RabbitMQ因为支持的协议更多,强调稳定性和社区活跃性,所以中小企业用的较多。
但是大型企业一般有对这些中间件做更深层次的定制要求,所以更多的选择RocketMQ,因为它是基于java开发的,定制开发起来或者说源码读起来都很方便。
基本概念(消费者组、订阅关系等)
Producer:消息的发送者,生产者;举例:发件人
Consumer:消息接收者,消费者;举例:收件人
Broker:暂存和传输消息的通道;举例:快递
NameServer:管理Broker;举例:各个快递公司的管理机构 相当于broker的注册中心,保留了broker的信息
Queue:队列,消息存放的位置,一个Broker中可以有多个队列
Topic:主题,消息的分类
Tag: 是消息的标签,用于对同一主题(Topic)下的消息进行进一步的分类
Key :默认有一个messageId当做消息的唯一标识,也可以给消息携带一个key,用作唯一标识或者业务标识,包括在控制面板查询的时候也可以使用messageId或者key来进行查询
ProducerGroup:生产者组
ConsumerGroup:消费者组,多个消费者组可以同时消费一个主题的消息,同一个组内的消费者订阅关系必须一致。一份消息会传递给每个组,可以被多个消费者组消费
,至于组内是广播还是定向则可以自己配置。
消息发送的流程是,Producer询问NameServer,NameServer分配一个broker 然后Consumer也要询问NameServer,得到一个具体的broker,然后消费消息
看官方文档,可知订阅关系的定义:一个消费者组订阅一个Topic的某一个Tag,这种记录被称之为订阅关系。