1. 消息队列RocketMQ认识

发布于 2022年 02月 10日 08:58

1、 什么是消息队列

消息队列是一种消息中间件,广义上由生产者、消费者,消息Broker组成。

架构图

2、角色介绍

2.1、Broker

消息中转角色,负责存储消息、转发消息。

  • broker主要用于producer和consumer接收和发送消息;
  • broker会定时向nameserver上报自己的元数据信息,包括消费者组、消费进度偏移和主题和队列消息等;
  • 是消息中间件的消息存储、转发服务器;
  • 每个Broker节点,在启动时,都会遍历NameServer列表,与每个NameServer建立长连接,注册自己的信息,之后定时上报;

2.2、Name Server

  • 理解成zookeeper的效果,只是他没用zk,而是自己写了个Name Server来替代zk;
  • 底层由netty实现,提供了路由管理、服务注册、服务发现的功能,是一个无状态节点;
  • Name Server是服务发现者,集群中各个角色(producer、broker、consumer等)都需要定时向Name Server上报自己的状态,以便互相发现彼此,超时不上报的话,Name Server会把它从列表中剔除;
  • Names Srver可以部署多个,当多个Name Server存在的时候,其他角色同时向他们上报信息,以保证高可用;
  • Name Server集群间互不通信,没有主备的概念,相互独立,没有信息交换;
  • Name Server内存式存储,Name Server中的broker、topic等信息默认不会持久化,所以他是无状态节点;

名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。多个Namesrv实例组成集群,但。

2.3、Producer

  • 消息的生产者;
  • 随机选择其中一个NameServer节点建立长连接,获得Topic路由信息(包括topic下的queue,这些queue分布在哪些broker上等等);
  • 接下来向提供topic服务的master建立长连接(因为rocketmq只有master才能写消息),且定时向master发送心跳;

2.4、Consumer

  • 消息的消费者;
  • 通过NameServer集群获得Topic的路由信息,连接到对应的Broker上消费消息;
  • 由于Master和Slave都可以读取消息,因此Consumer会与Master和Slave都建立连接进行消费消息;

3. 核心流程

  • Broker注册到Nameserver上;
  • Producer发消息的时候会从Nameserver上获取发消息的topic信息;
  • Producer向提供服务的所有master建立长连接,且定时向master发送心跳;
  • Consumer通过NameServer集群获得Topic的路由信息;
  • Consumer会与所有的Master和所有的Slave都建立连接进行监听新消息;

4. 核心概念

4.1 Message

消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。消息载体(message payload)中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。

4.2 topic

消息的逻辑分类,发消息之前必须要指定一个topic才能发,就是将这条消息发送到这个topic上。消费消息的时候指定这个topic进行消费。就是逻辑分类。每个消息只能属于一个主体。

4.3 queue

1个Topic会被分为N个Queue,数量是可配置的。message本身其实是存储到queue上的,消费者消费的也是queue上的消息。多说一嘴,比如1个topic4个queue,有5个Consumer都在消费这个topic,那么会有一个consumer浪费掉了,因为负载均衡策略,每个consumer消费1个queue,5>4,溢出1个,这个会不工作。

4.4 Tag

Tag 是 Topic 的进一步细分,顾名思义,标签。每个发送的时候消息都能打tag,消费的时候可以根据tag进行过滤,选择性消费。

4.5 Message Model

消息模型:集群(Clustering)和广播(Broadcasting)

4.6 Message Order

消息顺序:顺序(Orderly)和并发(Concurrently)

4.7 Producer Group

消息生产者组

4.8 Consumer Group

消息消费者组

推荐文章