RocketMQ分布式消息队列笔记
Posted Kris_u
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RocketMQ分布式消息队列笔记相关的知识,希望对你有一定的参考价值。
一、基本概念
一般消息的体量不会太大。
MQ的用途三种:
解耦异步、限流削峰、数据收集
限流削峰:MQ将系统的超量请求暂存其中,以便系统后期可与慢慢进行处理,从而避免了请求的丢失或系统被压垮。
异步解耦:上游系统对下游系统的调用若为同步调用,则会大大降低系统的吞吐量与并发度,且系统耦合度太高。而异步调用则会解决这些问题。所以两层之间若要实现由同步到异步的转化,一般性的做法是在这两层间添加一个MQ层。
数据收集:分布式系统会产生海量级数据流。如业务日志、监控数据、用户行为等。针对这些数据流进行实时或批量采集汇总,然后对这些数据流进行大数据分析,这是当前互联网平台的必备技术。
MQTT:Message Queuing Telemetry Transport(消息队列遥测传输),是IBM开发的一个即时通信协议,是一种二进制协议,主要用于服务器和低功耗IoT(物联网)设备间的通信。该协议支持所有平台,几乎可以把所有联网物品和外接连接起来i,被用来当作传感器和致动器的通信协议。RabbitMQ可以通过插件可以支持该协议。
RocketMQ:
消息(message):消息系统所传输信息的一个载体,生产和消费数据的最小单位,每条消息必须属于一个主题。
主题(Topic):表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消费和订阅的基本单位。
一个生产者可以同时发送多种Topic的消息;而一个消费者只对某种特定的Topic感兴趣,即只可以订阅和消费一种Topic的消息。
标签(Tag):用于同一主题下区分不同类型的消息。可以根据不同业务目的在同一主题下设置不同标签。标签可以有效保持代码的清晰度和连贯性,并优化RocketMQ提供的查询。
队列(Queue):存储消息的物理实体。一个Topic中可以包含多个Queue,每个Queue中存放的就是该Topic的消息。一个Topic的Queue也被称为一个Topic中消息的分区(Partition)。
一个Topic的Queue中的消息只能被一个消费者组中的一个消费者消费。
分片(Sharding)分片不同于分区。在RocketMQ中,分片指的是存放相应Topic的Broker。每个分片在中会创建出相应数量的分区,即Queue,每个Queue的大小都是相同的。
消息标识MessageId/Key()
RocketMQ中每个消息拥有唯一的MessageId,且可以携带具有业务标识的Key,以方便对消息的查询。不过需要注意的是,MessageId有两个:在生产者send()消息时会自动生成一个MessageId(msgId),当消息到达Broker后,Broker也会自动生成一个MessagedId (offsetMsgId)。MsgId、offsetMsgId与key都成为消息标识。
msgId:由producer产生,其生成规则:
producerIp + 进程pid + MessageClientIDSetter类的ClassLoader的hashCode+当前时间+AutomicInteger自增计数器。
offsetMsgId: 由broker端产生,其生成规则为:brokerIp + 物理分区的offset(Queue中的偏移量)
key: 由用户指定的业务相关的唯一标识。
RocketMQ系统架构:
主要包括四部分:
Producer:
消息生产者,负责生产消息。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败并且低延迟。
RockertMQ中的消息生产者模型都是以生产者组(Producer Group)的形式出现的。生产者组是同一类生产者的集合,这类Producer发送相同Topic类型的消息。一个生产者组可以同时发送多个主题的消息。
Consumer:
消息消费者,负责消费消息。一个消息消费者会从Broker服务器中获取到消息,并对消息进行相关业务处理。
RockertMQ中的消息消费者都是以消费者组的形式出现的。消费者组三同一类消费者的集合,这类Consumer消费的是同一个Topic类型的消息。消费者组使得在消息消费方面,实现负载均衡和容错的目标百年的非常容易。
Name Server:
Broker:
以上是关于RocketMQ分布式消息队列笔记的主要内容,如果未能解决你的问题,请参考以下文章