RocketMQ
RocketMQ
是什么?
一个消息中间件。
用途?
限流削峰,异步解耦,数据收集
限流削峰:当系统的很多数据请求的时候,服务器处理不过来,就加一个中间件用来暂存请求,避免服务器被压垮。
异步解耦:当一个订单请求过来要加积分,减库存,扣钱这一个个线程,如果是同步进行就会降低吞吐量,那么就需要异步执行,这时候就可以用MQ,让上游模块调用下游模块的时候用MQ实现异步。(上游就是发起请求然后异步调用下游服务)
数据收集:分布式系统会产生海量数据,业务日志,监控数据等。这些需要收集那么就可以用MQ,防止服务器被压垮,也能收集到数据。
常见的MQ:rabbitmq万级,kafka和rocketmq十万级
概念
消息
消息就是传输信息的载体。
主题
topic就是消息的集合,每个主题有很多消息,但是一个消息只能有一个主题。
一个生产者可以发送多个主题消息,但是一个消费者只能消费一个主题的消息。
标签
标签是消息的二级分类。
队列/分区
存储消息的载体,一个主题中有很多队列Queue,一个主题的队列也被称为消息的分区。
一个主题的队列中的消息只能被一个消费者消费,一个队列中的消息不能被同一个消费组中的多个消费者同时消费。
分片
分片指存放相应Topic的Broker,Broker里面存放相应主题的分区。这个是纵向的。
消息标识
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
消费者出现都是以消费者组出现的,然后消费者消费的是同一个主题类型的消息。消费者组在消息消费使用负载均衡,也就是同一个消费者组分配给不同的队列,平均分配。并且实现容错,一个消费者挂了,消费者组的其他消费者可以接着消费原来消费者消费的队列。
消费者组中消费者的数量应该小于等于订阅主题的队列数量,也就是说消费者组中的消费者要小于或者等于队列的数量。
一个主题类型的消息可以被多个消费者组同时消费,也就是说一个主题的队列可以被多个消费组里的消费者同时消费。






