RocketMQ复习

之前写的博客太杂,最近想把RocketMQ的知识点再系统的过一遍,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点可以参考之前写的一些博客,这篇不再赘述。
SpringCloud入门(3) RabbitMQ
RocketMQ学习(1) 快速入门
RocketMQ学习(2) 深入学习
RocketMQ学习(3) 秒杀实战

目录

  • MQ技术对比
  • 基本概念(消费者组、订阅关系等)
  • 消费模式
  • 各种消息类型
  • 重复消费问题(去重;幂等)
  • 重试机制与死信消息
  • 堆积问题
  • 丢失问题
  • 安全问题

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,这种记录被称之为订阅关系。

你可能感兴趣的:(微服务,rocketmq,微服务,java)