RocketMQ

是什么?

一个消息中间件。

用途?

限流削峰,异步解耦,数据收集

限流削峰:当系统的很多数据请求的时候,服务器处理不过来,就加一个中间件用来暂存请求,避免服务器被压垮。

异步解耦:当一个订单请求过来要加积分,减库存,扣钱这一个个线程,如果是同步进行就会降低吞吐量,那么就需要异步执行,这时候就可以用MQ,让上游模块调用下游模块的时候用MQ实现异步。(上游就是发起请求然后异步调用下游服务)

数据收集:分布式系统会产生海量数据,业务日志,监控数据等。这些需要收集那么就可以用MQ,防止服务器被压垮,也能收集到数据。

常见的MQ:rabbitmq万级,kafka和rocketmq十万级

概念

消息

消息就是传输信息的载体。

主题

topic就是消息的集合,每个主题有很多消息,但是一个消息只能有一个主题。

一个生产者可以发送多个主题消息,但是一个消费者只能消费一个主题的消息。

标签

标签是消息的二级分类。

队列/分区

存储消息的载体,一个主题中有很多队列Queue,一个主题的队列也被称为消息的分区。

一个主题的队列中的消息只能被一个消费者消费,一个队列中的消息不能被同一个消费组中的多个消费者同时消费。

分片

分片指存放相应Topic的Broker,Broker里面存放相应主题的分区。这个是纵向的。

image-20260217181821995

消息标识

rocketmq中每个消息有唯一的MessageId,且可以携带具有业务标识的Key,可以对消息进行查询。MessageId有两个,一个是生产者生产的时候会产生,消息达到Broker后,Broker也会产生一个offsetMsgId,这三个都是消息标识

  • msgId:由producer端生成,其生成规则为:producerIp + 进程pid + MessageClientIDSetter类的ClassLoader的hashCode +当前时间 + AutomicInteger自增计数器
  • offsetMsgId:由broker端生成,其生成规则为:brokerIp + 物理分区的offset(Queue中的偏移量)
  • key:由用户指定的业务相关的唯一标识

系统架构

rocketmq由四部分组成,消息生产,消息消费,注册中心NameServer,Broker

生产者Producer

生产者都是以生产者组形式出现,业务上一个消费者组生产一个主题的消息,实际上消费者组可以生产各种主题的信息。

消费者Consumer

消费者出现都是以消费者组出现的,然后消费者消费的是同一个主题类型的消息。消费者组在消息消费使用负载均衡,也就是同一个消费者组分配给不同的队列,平均分配。并且实现容错,一个消费者挂了,消费者组的其他消费者可以接着消费原来消费者消费的队列。

消费者组中消费者的数量应该小于等于订阅主题的队列数量,也就是说消费者组中的消费者要小于或者等于队列的数量。

一个主题类型的消息可以被多个消费者组同时消费,也就是说一个主题的队列可以被多个消费组里的消费者同时消费。