一、基本概念

  1. 消息(Message):消息系统所传输信息的物理载体,生产和消费的最小单位,每个消费必须属于一个主题(topic)。
  2. 主题(Topic):一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,RocketMQ进行消费订阅的基本单位。一个生产者可以同时发送多种Topic消息;一个消费者只对某种特定的topic感兴趣,可以订阅和消费一种topic。
  3. 标签(Tag):用于同一主题下区分不同类型的消息。
  4. 队列(Queue):存储消息的物理实体。一个Topic可以包含多个Queue,每个Queue中存放的是该topic的消息。一个topic的Queue也被称为一个topic的消息分区。
  5. 分片(Sharding):存放相应Topic的Brocker,每个分片中会创建出相应数量的分区,即Queue,每个Queue的大小都是相同的。
  6. 消息标识(MessageId/Key):每个消息拥有唯一的MessageId,且可以携带具有业务标识的Key,以方便对消息的查询。MessageId有两个:生产者send()消息时会生成一个Message(msgId),当消息到底Brocker后,Brocker也会自动生成一个MessageId(offsetMsgId)。
    msgId、offsetMsgId与key都成为消息标识。
    msgId:producerIp+进程pid+MessageClientIDSetter类的ClassLoader的hashCode+当前时间+AutomicInteger自增计数器。
    offsetMsgId:由brocker端生成:brokerIp+物理分区的offset。
    key:由用户指定的业务相关的唯一标识

二、系统架构

RocketMQ java 配置多个group rocketmq一个项目多个topic_负载均衡

  1. Producer 消息生产者,通过MQ负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败并且低延迟。
  2. Consumer 消息消费者,负责消费消息。一个消费者会从Broker服务器获取到消息,进行处理。
    实现负载均衡和容错,负载均衡指的是Queue的负载均衡。
    消费者中的Consumer数量应该小于等于topic中queue数量,多出来的consumer不能消费信息,资源浪费。
    注意:一个消费者组中的消费者必须订阅完全相同的topic;消费者组只能消费一个topic;
  3. Name Server,Broker与Topic路由的注册中心,支持Broker动态注册与发现。
    3.1 功能
    Broker管理:注册信息保留作为路由信息的数据;提供心跳检测机制,检测brocker是否存活。
    路由信息管理:生产者与消费者通过NameServer获取整个Broker集群的路由信息,进行消息的投递和消费。
    路由注册:NameServer集群方式部署,各个节点无通信。数据同步通过Broker轮巡与结点间建立长链接。优点:NameServe集群搭建简单,缺点:扩容麻烦。增加NameServe时,不修改配置文件,Broker将无法注册到该结点中。Broker为了证明自己存活,将id、地址名称、所属集群名称以心跳包方式发送给NameServe。
    路由剔除:查看心跳时间戳距离当前时间是否超时120秒。
    路由发现:采用Pull模型,当topic路由发生变化时,客户端采用每30秒拉取的方式获取最新路由。
    Push模型适合实时性要求较高、client数量不多、server数据变化频繁;
    LongPolling模型:长轮询模型,对push、pull整合。
  4. Broker:存储消息、转发消息。接收生产者发送的消息,为消费者拉取做准备。同时存储着消息相关元数据,包括消费者消费进度偏移offset、主题、队列等。 主备集群 。

三、工作流程

  1. 启动NameServer,等待Broker、Producer、Consumer链接;
  2. 启动Broker,与NameServer建立长链接,每30秒发送心跳包
  3. 发送消息前可以先创建Topic,指定存储在哪些Broker上,期间会自动将Topic与Broker关系写入NameServer中。这步可选,发送消息时自动创建Topic。
  4. Producer发送消息和NameServer中一台建立长链接,获取到Broker的地址映射关系,根据算法策略选择一Queue,获取到路由信息后,Producer先将路由信息缓存到本地,每30秒更新一次路由信息。
  5. Consumer和Producer类似,不同的是,Consumer会向Broker发送心跳。
    注意:读写队列需要设置 readQueueNums>=writeQueueNums ,方便队列的缩容。先修改写队列,再修改读队列, 消费者组的消费者数量和读队列有对应关系。当消费者将多余队列消费掉,再修改读队列。
    Perm:表示当前创建topic权限,2-只写 4-只读 6-读写都可以。