• RockerMq--入门


    RockerMq入门


    一. 简介

    Apache RocketMQ是一款具有低延迟,高性能和可靠性,数十亿容量和灵活可扩展性的分布式消息传递和流媒体平台。它由NameServer、Broker、Producer以及Consumer四部分构成

    1. 什么是消息中间件

    消息中间件是利用高效可靠的消息传递机制进行平台无关的数据通信来达到分布式系统的集成目的,通过提供消息传递和消息排队模型,可以在分布式架构下扩展进程之间的通信。对于消息中间件,常见的角色就是Producer(生产者)、Consumer(消费者) 、broker(消息中间件实例)。

    2. 消息中间件的使用场景
    1. 异步与解耦
      在这里插入图片描述

    2. 流量削峰
      在这里插入图片描述

    3. 数据分发
      在这里插入图片描述

    3. RocketMq执行流程

    在这里插入图片描述
    执行流程:

    1. 启动 NameServer,NameServer 启动后监听端口,等待 Broker、Producer、Consumer 连上来,相当于一个路由控制中心。
    2. Broker 启动,跟所有的 NameServer 保持长连接,定时发送心跳包。心跳包中包含当前 Broker 信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer 集群中就有 Topic 跟 Broke r的映射关系。
    3. 收发消息前,先创建 Topic,创建 Topic 时需要指定该 Topic 要存储在哪些 Broker 上,也可以在发送消息时自动创建 Topic。
    4. Producer 发送消息,启动时先跟 NameServer 集群中的其中一台建立长连接,并从 NameServer 中获取当前发送的 Topic 存在哪些 Broker 上,轮询从队列列表中选择一个队列,然后与队列所在的 Broker 建立长连接从而向
      Broker 发消息。
    5. Consumer 跟 Producer 类似,跟其中一台 NameServer 建立长连接,获取当前订阅 Topic 存在哪些 Broker 上,然后直接跟 Broker 建立连接通道,开始消费消息。

    RocketMQ 需要先启动NameServer,再启动 RocketMQ 中的 Broker。

    二. 学习导图

    在这里插入图片描述

    三. 角色介绍

    1. nameserver

    nameserver的底层是由netty实现:提供路由管理、服务注册、服务发现的功能,是一个无状态的节点

    nameserver作为服务的发现者:集群中的各个角色(producer、broker、consumer)都要定时的向nameserver上报自己的状态,以便互相发现彼此,超时不上报会从列表中剔除。

    nameserver可以集群化部署:当有多个nameserver存在时,其他角色会同时向他们上报信息,这样可以保证nameserver的高可用性,他们之间互不通信,没有主从的关系。

    2. broker

    broker面向producer(发送消息)、consumer(接受消息),broker需要向nameserver提交自己的信息,是消息中间件的消息存储器和消息转发器。每个broker在启动的时候都会遍历nameserver的列表,与每一个nameserver建立连接,注册自己的信息,之后定时向每一个nameserver上报。

    3. producer

    producer是消息的生产者,通过集群中的任意一个(nameserver)节点(随机选择)建立长连接,获取topic的路由信息【包括Topic下有那些queue,这些queue分布在哪些broker上等等】。接下来向提供topic服务的master(broker)建立长连接,且定时发心跳。

    4. consumer

    consumer和nameserver保持连接,每隔30s将会从nameserver服务器中查询topic路由信息,查询到路由信息信息后,就会根据ip映射件从broker中消费消息。跟broker的连接也是30s向broker发送跳检测

    四. 基本概念

    1. 消息(Message)

    消息(Message):生产或消费的数据,对于 RocketMQ 来说,消息就是字节数组。

    2. 主题(Topic)

    主题(Topic):区分消息的种类,标识一类消息的逻辑名字,消息的逻辑管理单位。无论消息生产还是消费,都需要指定 Topic。

    • 一个发送者可以发送消息给一个或者多个 Topic;
    • 一个消息的接收者可以订阅一个或者多个 Topic 消息。
    3. 对列(Queue )

    消息队列(Message Queue):简称 Queue 或 Q,消息物理管理单位。用于并行发送和接收消息,相当于是Topic的分区。

    一个 Topic 将有若干个 Q。若一个 Topic 创建在不同的 Broker,则不同的 broker 上都有若干 Q,消息将物理地存储落在不同 Broker 结点上,具有水平扩展的能力。

    无论生产者还是消费者,实际的生产和消费都是针对 Q 级别。

    注意: 在 RocketMQ 中,所有消息队列都是持久化的,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,offset为 java long 类型,64 位,理论上在 100年内不会溢出,所以认为为是长度无限,另外队列中只保存最近几天的数据,之前的数据会按照过期时间来删除。也可以认为Message Queue是一个长度无限的数组,offset 就是下标。

    4. 分组(Group)

    Group 分为两个部分 生产者和消费者

    • 生产者: 表示发送同一类消息的 Producer,通常情况下发送逻辑是一致的。发送普通消息时,用于标识使用,没有特别的用处。
      主要用来作用于事务消息,当事务消息中某条消息一直处于等待状态并超时,Broker会回查同一个Group下的其他producer,确定该消息是 commit 还是 rollback
    • 消费者: 消费者的分组就非常有意义了,消费者是标识一类 ​​Consumer​​ 的集合名称,这类 ​​Consumer​​ 通常消费一类消息,且消费逻辑一致。同一个 ​​Consumer Group​​ 下的各个实例将共同消费 topic 的消息,起到负载均衡的作用。
      消费进度以​​Consumer Group​​ 为粒度管理,不同 ​​Consumer Group​​ 之间消费进度彼此不受影响,即消息 A 被 ​​Consumer Group1​​ 消费过,也会再给 ​​Consumer Group2​​ 消费。
    5. 标签(Tag)

    RocketMQ 支持在发送时给 topic 的消息设置 tag,用于同一主题下区分不同类型的消息。

    来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。

    比如有一个 Topic 消息为水果,那么水果可以有其他的标签 可以是 香蕉、西瓜、草莓等等,我们可以把对应的消息,打上对应的标签(Tag),这个就是方便我们在消费的时候做对应的筛选。

    标签能够有效地保持代码的清晰度和连贯性,并优化 RocketMQ 提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。

    6. 偏移量(Offset)

    在 RocketMQ 中,有很多 offset 的概念。一般我们只关心暴露到客户端的offset。不指定的话,一般指的是消费者消息的偏移量(ConsumerOffset)

    ​​Message queue​​ 是无限长的数组。一条消息进来下标就会涨 1,而这个数组的下标就是 offset。

    ​​Message queue​​​ 中的 max offset 表示消息的最大 offset,​​Consumer offset​​​ 可以理解为标记 Consumer Group 在一条逻辑 ​​Message Queue​​ 上,消息消费到哪里即消费进度。

    基本概念参考:Apache RocketMQ中文文档

  • 相关阅读:
    新生儿黄疸:原因、科普和注意事项
    【矩阵论】4. 矩阵运算——广义逆——广义逆的计算
    基于Python旅游景区景点售票系统设计与实现 开题报告
    用亲身经历把朋友送进腾讯是什么体验?
    线性dp,271. 杨老师的照相排列
    AnalyticDB Mysql(ADB分析型数据库)-数值相除转字符串小数点后出现很多0拼接%后出现很多0
    洛谷 P5058 [ZJOI2004]嗅探器(割点)
    Webpack从0到1搭建Vue3项目
    零数科技受邀出席2019全球未来出行大会
    RabbitMQ初步到精通-第十章-RabbitMQ之Spring客户端源码
  • 原文地址:https://blog.csdn.net/qq_44936392/article/details/127634579