一篇文章了解RocketMQ基础知识。

目录

一.  为什么选择了 RocketMQ ?

二.  RocketMQ 介绍

名词说明

1. Topic (主题) 

1.1 Topic 核心作用

1.2 Topic 常见问题

2. Tag  (标签)

3. Queue  (队列)

  3.1 Queue 读写队列

4. Message (消息)

4.1 Message 类型

5.  Producer (生产者)

6.  Consumer(消费者)

7.  NameServer  (名字服务器)

 8.  Broker  (代理服务器)

8.1 Broker 几个重要的子模块 

三.  RocketMQ 工作流程

集群之间交互方式


一.  为什么选择了 RocketMQ ?

        在阿里孕育 RocketMQ 的雏形时期,我们将其用于异步通信、搜索、社交网络活动流、数据管道,贸易流程中。随着我们的贸易业务吞吐量的上升,源自我们的消息传递集群的压力也变得紧迫。

        根据我们的研究,随着队列和虚拟主题使用的增加,ActiveMQ IO模块达到了一个瓶颈。我们尽力通过节流、断路器或降级来解决这个问题,但效果并不理想。于是我们尝试了流行的消息传递解决方案Kafka。不幸的是,Kafka不能满足我们的要求,其尤其表现在低延迟和高可靠性方面,详见这里。在这种情况下,我们决定发明一个新的消息传递引擎来处理更广泛的消息用例,覆盖从传统的pub/sub场景到高容量的实时零误差的交易系统。

        Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。

二.  RocketMQ 介绍

        在正式学习使用RocketMQ之前, 要了解几个区别于标准消息中间件的概念.   如Group、Topic、Queue等。

        系统组成则由 Producer(生产者)、Consumer(消费者)、Broker(服务代理器)、NameServer(名称服务器)等组件组成。

名词说明

1. Topic (主题) 

        Topic主题是RocketMQ中消息传输和存储的顶层存储, 表示一类消息的集合. 每个topic 主题包含若干条message . 每条message 只能属于一个topic主题. 

        可以理解为消息的分类.  但主题是一个逻辑概念,并不是实际的消息容器。现在垃圾都提倡分类了. 消息可不能一个topic干到底啊. 

1.1 Topic 核心作用
  • 定义数据的分类隔离: 将不同业务类型的数据拆分到不同的主题中管理. 通过主题实现存储隔离性, 订阅隔离性. 
  • 定义数据的身份和权限 :  RocketMQ 本身是匿名无身份的.  同一类的消息使用相同主题来做身份识别和权限管理. 

1.2 Topic 常见问题
  • Topic 拆分过细,  别有的小伙伴听说是分类用的.  于是把主题拆的很细, 一个用户一个Topic 一笔交易是一个Topic.  太壮观了👍.  这样会消耗大量的主题资源, 造成系统负载过重. 
  • Topic 拆分过粗,  上面小编写了不能拆分过细, 那么是不是越粗越好呢?  甚至就不拆了. 这样也不好, 会导致业务隔离性差 ,不利于独立运维和故障处理.  遇到问题排查起来会费劲很多. 
  • Topic 线上开启自动化,RocketMQ提供了自动化创建主题的功能.  在开发阶段用的是一个字 爽 , 上线别忘记关掉啊.  这样过一段时间发现会产生大量的垃圾主题,  这样就无法管理和回收并浪费资源.   

2. Tag  (标签)

        Topic 与 Tag 都是业务上用来归类的标识,区别在于 Topic 是一级分类,而 Tag 可以理解为是二级分类。使用 Tag 可以实现对 Topic 中的消息进行过滤。用于同一主题下区分不同类型的消息。

        比如支付消息可以分为: 创建支付订单消息, 支持结果消息, 支持完成消息等. 一条消息可以没有Tag.  标签有助于您代码的干净和连贯. 

3. Queue  (队列)

        相当于Topic 的分区, 用于并行发送和接收消息的. 队列是消息存储和传输的实际容器, 也是RocketMQ 中最小存储单位. 一个Topic中可以包含多个Queue. 

  3.1 Queue 读写队列

        Queue 分为读队列(对于消费者来说) 和 写队列(对于生产者来说) 默认创建数量都是4, 这个读写队列是在逻辑上进心划分得, 在物理上读写是一个队列。 Produce 发送消息进入写队列, Consumer从读队列中获取消息, 一般情况下读写队列数量是一样得。 

        RocketMQ 中是以Topic为单位进行管理得, 但是实际传输还是Queue ,也就是说无论消息发送还是消费都是到实际得Queue中进行操作。 

4. Message (消息)

        消息是RocketMQ中最小数据传输单元, 生产者将业务的负载和拓展属性包装成消息发送到RocketMQ服务端,服务端按照相关语义将消息投递到消费端进行消费。 

4.1 Message 类型
  • 普通消息 ,消息本身无特殊语义,消息之间没有任何关联。 就是发送一条普通的消息。
  • 批量消息, 就是将多个消息同时发送过去, 减少网络请求次数。多个普通消息同时发送,这就是批量消息。普通消息和批量消息比较简单, 没有复杂的逻辑,就是将消息发送出去。
  • 顺序消息, 就是生产者发送消息的顺序跟消费者消费消息的顺序一样。 
  • 延迟消息, 就是生产者发送消息后,消费者不会立马消费。而是等待一定时间之后再消费。
  • 事务消息, RocketMQ支持分布式事务消息,支持应用数据库更新和消息调用的一致性保障。 
  • 请求应答消息, 这种消息比较有意思,类似RPC模式。 生产者发送消息之后可以阻塞等待消费者消费这个消息的之后返回的结果。
  • 重试消息, 这个并不是我们业务中主动发送的。 而是指消费者消费消息失败之后, 会间隔一段时间之后再次消费这条消息。 
  • 死信消息, 就是指一条信息最终无法被正常消费, 那么这条消息就称为死信消息。 
  • 同步消息, 就是指生产者发送消息后, 等待服务器响应消息结果。
  • 异步消息, 有了同步消息,那么肯定少不了异步消息,异步消息就是生产者发送消息后,不需要等待服务器响应消息结果,直接返回。 对同步异步不太清楚的可以阅读一下为什么要选择MQ? 有什么好处
  • 单项消息, 所谓单项消息就是生产者发送到服务端就不管了。无论成功失败都不在理会。

5.  Producer (生产者)

        生产者就是发送消息的角色。 通过nameserver的负载均衡模块选择相应的Broker集群队列中进行消息投递。 

6.  Consumer(消费者)

        消费者也称为订阅者, 负责从Topic中接收并消费消息。 

7.  NameServer  (名字服务器)

        NameServer是一个简单的Topic路由注册中心。支持Topic ,Broker的动态注册与发现。 主要两个功能,

        Broker管理,  NameServer接收Broker集群的注册信息并保存下来作为路由信息的基本数据, 然后提供心跳检测机制,检测Broker是否存活。

        路由信息管理, 每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询队列信息。 Producer 和 Consumer 通过NameServer 就可以知道整个Broker 集群的路由信息, 从而进行消息的投递和消费。 

        NameServer 通常是以集群的方式部署的, NameServer 是无状态的,  有什么有缺点:

        优点: NameServer 集群搭建简单,扩展简单。 

        缺点: 对于Broker ,必须明确指出所有的NameServer 地址。 否则未指出的地址将不会被注册。也正因为如此,NameServer不能随意的扩容, 因为,若Broker不重新配置, 新增的NameServer 对于Broker来说是不可见的, 也不会向 这个NameServer进行注册。

 8.  Broker  (代理服务器)

        Broker 主要负责消息的存储投递查询以及服务高可用保证。 是一个消息中转角色,负责存储消息,转发消息, 在RocketMQ中负责接收存储从生产者发来的消息,同时也为消费者拉去消息做准备。  

8.1 Broker 几个重要的子模块 
  • 远程处理模块, Broker入口,处理来自客户端的请求。
  • 客户端管理,管理客户端(包括生产者和消费者), 维护消费者的主题订阅。
  • 存储服务, 提供在物理磁盘上存储和查询消息简单的API.
  • HA 服务, 提供冲Broker间数据同步。
  • 索引服务, 通过指定键为消息建立索引并提供快速查找消息。

三.  RocketMQ 工作流程

交互方式

  • Broker Master和Broker Slave 是主从结构,会执行数据的同步
  • 每个Broker 与NameServer  集群中所有的节点建立长连接,定时注册Topic信息到所有的NameServer
  • Producer 与 NameServer 随机任意一个节点建立长连接,定期获取Topic 的路由信息。 并于提供Topic的Broker Master 建立长连接, 定期给Broker发送心跳信息
  • Producer 只能将消息发送到Broker Master, 但是Consumer 同时和Broker Master 和Broker Slave 建立长连接, 即可以从Master 订阅消息,也可以从Slave 订阅消息。

ps: 文章中官方描述来源于 rocketmq.apache.org

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备视频报警功能详解

在科技日新月异的今天,视频监控系统作为现代社会的“第三只眼”,正以前所未有的方式深刻影响着我们的生活与社会结构。从公共场所的安全监控到个人生活的记录分享,视频监控系统以其独特的视角和功能,为社会带来了诸多好处&#xf…

day10:ssh服务-跳板机

一,ssh服务概述 ssh服务概述 ssh(Secure Shell)是一种用于在不安全网络中进行安全登录、远程执行命令及传输文件的网络协议。它通过加密技术来保证通信的保密性和完整性,主要用于替代不安全的telnet、rlogin、rsh等协议。ssh通常…

python爬虫实战案例——抓取B站视频,不同清晰度抓取,实现音视频合并,超详细!(内含完整代码)

文章目录 1、任务目标2、网页分析3、代码编写 1、任务目标 目标网站:B站视频(https://www.bilibili.com/video/BV1se41117WP/?vd_sourcee8e376ccbc5aa4cfd88e6a7917adfd1a),用于本文测验 要求:抓取该网址下的视频&…

【制造业&电子产品】电脑电子元件检测系统源码&数据集全套:改进yolo11-TADDH

改进yolo11-SCConv等200全套创新点大全:电脑电子元件检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.24 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者…

Linux: network: wireshark IO图的一个问题

今天遇到一个问题,发现wireshark画的IO图,前几秒没有数据,但是根据Raw的pcap看,是有包的,这就迷惑了。 经同事提醒,这个IO在设置了多个画图filter的时候,可能导致开始前几秒没有输出。如下图 这…

jenkins ssh 免密报错Host key verification failed.

jenkins 发布项目,ssh连接远程服务器时报错:Host key verification failed. 解决: 原因是生成的sshkey不是用的jenkins用户,所以切换用户到:jenkins重新生成sshkey su jenkins ssh-keygen -t rsa ssh-copy-id -i ~/…

C# 串口通信教程

串口通信(Serial Communication)是一种用于设备之间数据传输的常见方法,通常用于与外部硬件设备(如传感器、机器人、微控制器)进行通信。在 C# 中,System.IO.Ports 命名空间提供了与串口设备交互的功能&…

mono源码交叉编译 linux arm arm64全过程

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

GPT-4o 和 GPT-4 Turbo 模型之间的对比

GPT-4o 和 GPT-4 Turbo 之间的对比 备注 要弄 AI ,不同模型之间的对比就比较重要。 GPT-4o 是 GPT-4 Turbo 的升级版本,能够提供比 GPT-4 Turbo 更多的内容和信息,但成功相对来说更高一些。 第三方引用 在 2024 年 5 月 13 日&#xff0…

8.MySQL复合查询

目录 复合查询基本查询回顾多表查询 - 笛卡尔积自连接子查询单行子查询多行子查询多列子查询在from中使用子查询 合并查询unionunion all 表的内连和外连内连接外连接左外连接右外连接 复合查询 前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远…

HTML+JavaScript案例分享: 打造经典俄罗斯方块,详解实现全过程

在本文中,我们将深入探讨如何使用 JavaScript 实现经典的俄罗斯方块游戏。俄罗斯方块是一款广为人知的益智游戏,通过操纵各种形状的方块,使其在游戏区域内排列整齐,以消除完整的行来获得分数。 效果图如下: 一、游戏界面与布局 我们首先使用 HTML 和 CSS 来创建游戏的界面…

java智能物流管理系统源码(springboot)

项目简介 智能物流管理系统实现了以下功能: 智能物流管理系统的主要使用者分为管理员,顾客,员工,店主。功能有个人中心,顾客管理,员工管理,店主管理,门店信息管理,门店…

查看Chrome安装路

谷歌Google浏览器查看安装路径,浏览器Google Chrome浏览器查看安装路径 chrome://version/ 来源:笔记云

idea安装visualVm插件

idea 安装visualVM插件用于分析java程序, 1.在插件市场安装visualvm launcher 2.安装成功后,重启idea,此时启动按钮旁边有这两个按钮 3.需要在这里配置插件的visualvm位置 4.配置完后,点击启动

已解决 django.db.utils.OperationalError: (1051, “Unknown table

报错信息: django.db.utils.OperationalError: (1051, "Unknown table bjybolg.tool_submission")python manage.py migrate --fake 命令用于告诉 Django 假装已经应用某个迁移,而不实际执行该迁移的操作。这通常在以下情况下非常有用&#x…

Layout 布局组件快速搭建

文章目录 设置主题样式变量封装公共布局组件封装 Logo 组件封装 Menu 菜单组件封装 Breadcrumb 面包屑组件封装 TabBar 标签栏组件封装 Main 内容区组件封装 Footer 底部组件封装 Theme 主题组件 经典布局水平布局响应式布局搭建 Layout 布局组件添加 Layout 路由配置启动项目 …

Linux: Shell编程入门

Shell 编程入门 1 ) Shell 概念 shell 是 在英语中 壳, 外壳的意思可以把它想象成嵌入在linux这样的操作系统里面的一个微型的编程语言不像C语言, C 或 Java 等编程语言那么完整,它可以帮我们完成很多自动化任务例如保存数据监测系统的负载等等,我们同样…

【ArcGIS Pro实操第8期】绘制WRF三层嵌套区域

【ArcGIS Pro实操第8期】绘制WRF三层嵌套区域 数据准备ArcGIS Pro绘制WRF三层嵌套区域Map-绘制三层嵌套区域更改ArcMap地图的默认显示方向指定数据框范围 Map绘制研究区Layout-布局出图 参考 本博客基于ArcGIS Pro绘制WRF三层嵌套区域,具体实现图形参考下图&#xf…

从零开始学五笔(七):折区字根

讲解格式: 先介绍按键的区位号、口诀内容、口诀说明然后列每个字根能组成什么汉字,难拆字将用中括号标出 ‍ N 键 区位号:51 口诀:已半巳满不出己,左框折尸心和羽 说明: 已半巳满不出己:指…

CentOS 8修改Linux配置文件指定属性的值

1.前提: 存在test空文件(test位于/etc/sysconfig/network-scripts目录) 2.test文件插入内容: 1)添加内容:IPADDR192.168.132.129 echo IPADDR192.168.132.129 | sudo tee -a /etc/sysconfig/network-sc…