RocketMQ概念与模型

95 阅读3分钟

为啥要用MQ?

这个都应该会背了,6个字 解耦、异步、削峰

RocketMQ的优缺点?适用场景?

主要与Kafka相比 单机吞吐量:十万级(类似kafka) 消息堆积:支持10亿级别消息堆积 源码是 Java 天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其电商里订单扣款、业务削峰,业务场景在阿里双11经历过多次考验;

RocketMQ的消息模型是什么?

RocketMQ的消息模型是发布-订阅模型。 image.png

Topic 类似邮寄系统中的城市 如一个电商系统可以分为:交易消息、物流消息等,一条消息必须有一个 Topic 。 一个生产者也可以同时向不同的 Topic 发送消息; 一个 Topic 可以有0个、1个、多个生产者向其发送消息; 一个 Topic 也可以被 0个、1个、多个消费者订阅;

Message 一条消息必须有一个主题(Topic),也就是要邮寄的城市

Tag 类似城市下面的区 为消息提供进一步区分,比如将交易消息分为:交易创建消息、交易完成消息等,一条消息可以没有 Tag ;

Group RocketMQ中,订阅者的概念是通过消费组(Consumer Group)来体现的 一条消息被Consumer Group1消费过,也会再给Consumer Group2消费。

Message Queue Message Queue(消息队列),一个 Topic 下可以设置多个消息队列,Topic 包括多个 Message Queue ,如果一个 Consumer 需要获取 Topic下所有的消息,就要遍历所有的 Message Queue。

Offset Queue 是一个长度无限的数组,Offset 就是下标。 RocketMQ为每个消费组在每个队列上维护一个消费位置(Consumer Offset),这个位置之前的消息都被消费过,之后的消息都没有被消费过,每成功消费一条消息,消费位置就加一。

image.png

RocketMQ的架构

image

NameServer

作用是什么? 保存路由信息(Topic的路由信息)

NameServer 是一个无状态的服务器,类似于 Kafka中的 Zookeeper,比 Zookeeper 轻。

当然这种轻也会带来新的问题:数据不一致

也就是2个NameServer的路由信息不一样

Broker

作用是什么? 存储和转发消息 Broker 内部有一个个 Consumer Queue,用来存储消息的索引,真正存储消息的地方是 CommitLog(日志文件)。

Broker 与所有的 Nameserver 保持着长连接和心跳,定时将 Topic 信息同步到 NameServer。

Producer

发送消息 用户自行实现和分布式部署 消息由Producer通过多种负载均衡模式发送到Broker集群

支持3种方式发送消息:同步、异步和单向

  1. 同步发送:同步发送指消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。一般用于重要通知消息,例如重要通知邮件、营销短信。
  2. 异步发送:异步发送指发送方发出数据后,不等接收方发回响应,接着发送下个数据包,一般用于可能链路耗时较长而对响应时间敏感的业务场景,例如用户视频上传后通知启动转码服务。
  3. 单向发送:单向发送是指只负责发送消息而不等待服务器回应且没有回调函数触发,适用于某些耗时非常短但对可靠性要求并不高的场景,例如日志收集。

Consumer

资料来源: