RocketMQ高可用架构涉及常用功能整理

RocketMQ高可用架构涉及常用功能整理

  • 1. 集群高可用系统架构和相关组件
    • 1.1 架构说明
    • 1.2 相关概念说明
    • 1.3 消息模型
      • 1.3.1 点对点模型
      • 1.3.2 发布订阅模型
      • 1.3.3 消息过滤
  • 2. rocketmq的核心参数
  • 3. rocketmq常用命令
  • 4. 事务性
    • 4.1 数据写入流程
    • 4.2 数据读流程
    • 4.3 事务消息
  • 5. 疑问和思考
    • 5.1 rocketmq的数据删除策略是怎样的?
  • 6. 参考文档

探讨rocketmq的系统架构以及以及整体常用的命令和系统分析,本文主要探讨高可用版本的rocketmq集群,并基于日常工作中的沉淀进行思考和整理。更多关于分布式系统的架构思考请参考文档关于常见分布式组件高可用设计原理的理解和思考


1. 集群高可用系统架构和相关组件

在常用的3大mq中,各有各自的性能差异,并且也有相互的弊端

  • ActiveMQ: 产品比较成熟,产品出现的比较早,能够支持多种客户端语言,相关的sdk相对丰富。但是产品功能相对简单,并且在设计之初是单机版,虽然后续有高可用版本,但是整体上集群的性能和高可用能力整体偏弱 ActiveMQ高可用架构涉及常用功能整理
  • RocketMQ: 产品上能够提供高可用能力,能够支持多种客户端语言,相关的sdk相对丰富,能够提供丰富的数据路由模式,并且鉴权设计完善。但是在多种模式中(比如镜像模式),数据使用镜像模式,集群的性能整体能力偏弱 RabbitMQ高可用架构涉及常用功能整理
  • Kafka: kafka的数据定位跟MQ略有不同,最大的不同时kafka不能提供消息生产即删除的语义,这会导致在产品定位上略有不同 KAFKA高可用架构涉及常用功能整理

纵观这3大mq的性能特点,似乎缺少一种能够提供强大的高可用扩展能力,并且能够提供丰富的mq特性的产品,并且能够完善的鉴权设计的产品。这也许就是rocketmq这个产品能够生产和问世的出发点。事实上,rocketmq在架构设计上,明显弥补了如上mq所面临的问题。但是由于rocketmq产品问世的时间较短,对java语言能够提供丰富的sdk,但是对于其他开发语言的支持以及社区生态还需要进一步建设。

1.1 架构说明

rocketmq的整体架构如下
在这里插入图片描述

相关核心的组件和角色作用如下

组件部署模式组件作用备注
producer客户端部署生产者创建消息消息一般可以包含 2 个部分: 消息体和标签
consumer客户端部署消费者连接到 RocketMQ 服务器,订阅到队列。消费者消费一条消息时,只消费消息的消息体(payload)在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者只会消费到消息体,也就不知道消息的生产者是谁,当然消费者也不需要知道
NameServer多机部署NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息。
BrokerServer多机部署、主从模式Broker主要负责消息的存储、投递和查询以及服务高可用保证包含多个子模块,提供完整的消息生产、消费服务

1.2 相关概念说明

列出重要的相关概念,更多概念可以参考 官网

角色说明角色作用备注
topicApache RocketMQ 中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息1.定义数据的分类隔离、2.定义数据的身份和权限,可以基于topic进行多租户的权限隔离设计
queueApache RocketMQ 中消息存储和传输的实际容器,也是 Apache RocketMQ 消息的最小存储单元Apache RocketMQ 的所有主题都是由多个队列组成,以此实现队列数量的水平拆分和队列内部的流式存储,类似kafka的partition
tagTag标签过滤方式是 Apache RocketMQ 提供的基础消息过滤能力,基于生产者为消息设置的Tag标签进行匹配。生产者在发送消息时,设置消息的Tag标签,消费者需指定已有的Tag标签来进行匹配订阅。

topic和queue之间的关系如下图(类似kafka中的topic和parition关系)
在这里插入图片描述

1.3 消息模型

1.3.1 点对点模型

在这里插入图片描述
点对点模型也叫队列模型,具有如下特点:

  • 消费匿名:消息上下游沟通的唯一的身份就是队列,下游消费者从队列获取消息无法申明独立身份。
  • 一对一通信:基于消费匿名特点,下游消费者即使有多个,但都没有自己独立的身份,因此共享队列中的消息,每一条消息都只会被唯一一个消费者处理。因此点对点模型只能实现一对一通信。

1.3.2 发布订阅模型

在这里插入图片描述
发布订阅模型具有如下特点:

  • 消费独立:相比队列模型的匿名消费方式,发布订阅模型中消费方都会具备的身份,一般叫做订阅组(订阅关系),不同订阅组之间相互独立不会相互影响。
  • 一对多通信:基于独立身份的设计,同一个主题内的消息可以被多个订阅组处理,每个订阅组都可以拿到全量消息。因此发布订阅模型可以实现一对多通信。

发布订阅模式下,rocketmq的topic和queue提供的功能跟kafka的topic和partition关系很类似。

1.3.3 消息过滤

消费者订阅了某个主题后,Apache RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息,可通过设置过滤条件在 Apache RocketMQ 服务端进行过滤,只获取到需要关注的消息子集,避免接收到大量无效的消息。本文介绍消息过滤的定义、原理、分类及不同过滤方式的使用方法、配置示例等。
在这里插入图片描述

Tag标签过滤
Tag标签过滤方式是 Apache RocketMQ 提供的基础消息过滤能力,基于生产者为消息设置的Tag标签进行匹配。生产者在发送消息时,设置消息的Tag标签,消费者需指定已有的Tag标签来进行匹配订阅。
在这里插入图片描述

2. rocketmq的核心参数

参考 Admin Tool

3. rocketmq常用命令

参考 Admin Tool

4. 事务性

4.1 数据写入流程

参考 生产者(Producer)

4.2 数据读流程

参考 消费者分组(ConsumerGroup)

4.3 事务消息

事务消息是 Apache RocketMQ 提供的一种高级消息类型,支持在分布式场景下保障消息生产和本地事务的最终一致性。

事务消息交互流程如下图所示。在这里插入图片描述

  1. 生产者将消息发送至Apache RocketMQ服务端。
  2. Apache RocketMQ服务端将消息持久化成功之后,向生产者返回Ack确认消息已经发送成功,此时消息被标记为"暂不能投递",这种状态下的消息即为半事务消息。
  3. 生产者开始执行本地事务逻辑。
  4. 生产者根据本地事务执行结果向服务端提交二次确认结果(Commit或是Rollback),服务端收到确认结果后处理逻辑如下:
  5. 二次确认结果为Commit:服务端将半事务消息标记为可投递,并投递给消费者。
  6. 二次确认结果为Rollback:服务端将回滚事务,不会将半事务消息投递给消费者。
  7. 在断网或者是生产者应用重启的特殊情况下,若服务端未收到发送者提交的二次确认结果,或服务端收到的二次确认结果为Unknown未知状态,经过固定时间后,服务端将对消息生产者即生产者集群中任一生产者实例发起消息回查。 说明 服务端回查的间隔时间和最大回查次数,请参见参数限制。
  8. 生产者收到消息回查后,需要检查对应消息的本地事务执行的最终结果。
  9. 生产者根据检查到的本地事务的最终状态再次提交二次确认,服务端仍按照步骤4对半事务消息进行处理。

更详细环节参考 事务消息

5. 疑问和思考

5.1 rocketmq的数据删除策略是怎样的?

参考 消息存储和清理机制

6. 参考文档

  • RocketMQ官网

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

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

相关文章

Linux下HTTP隧道技术的应用场景与优势分析

亲爱的Linux侠们,今天我们来聊一聊Linux下HTTP隧道技术的应用场景与优势。在这个网络时代,HTTP隧道技术就如同一位神秘的“魔法师”,为我们解决了许多棘手的网络问题。 首先,让我们来看看HTTP隧道技术在哪些场景下能大展身手。 …

GenAI的“关键一跃”:推理与知识

当前的人工智能领域正通过生成式人工智能(GenAI)经历一场重大转变。这一转变不仅代表了技术上的飞跃,更标志着人工智能领域的范式转变,引发了有关GenAI的独特特性及其深远影响的关键问题讨论。 植根于计算革命的丰富历史&#xff…

JavaWeb——002JS Vue快速入门

目录 一、JS快速入门​编辑 1、什么是JavaScript?​编辑 2、JS引入方式​编辑 2.1、示例代码 3、JS基础语法 3.1、书写语法 3.2、变量​编辑 3.3、数据类型 3.4、运算符​编辑 3.5、流程控制语句​编辑 4、JS函数 4.1、第一种函数定义方式 function funcName(参数…

【统计分析数学模型】聚类分析

【统计分析数学模型】聚类分析 一、聚类分析1. 基本原理2. 距离的度量(1)变量的测量尺度(2)距离(3)R语言计算距离 三、聚类方法1. 系统聚类法2. K均值法 三、示例1. Q型聚类(1)问题描…

【2024软件测试面试必会技能】Appium自动化(4):Appium工作原理及Desired Capabilities配置

Appium工作原理 Appium工作原理图如下: 脚本请求——>4723端口appium server——>解析参数给PC端4724端口——>发送给设备4724端口——>通过设备4724端口发给bootstrap.jar——>Bootstrap.jar把命令发给uiautomator; sonWireProtocol&a…

java常用应用程序编程接口(API)——Objects类和包装类

前言: Object类和Objects类是完全不同的两个类,之前有说过Object类,这次说一下Objects类。打好基础,daydayup! Object类可以看这篇:java常用应用程序编程接口(API)——Object类概述及常用方法 O…

计算机网络基础之计算机网络组成与分类

计算机网络基础 计算机网络是计算机技术与通信技术发展相结合的产物,并在用户需求的促进下得到进一步的发展。通信技术为计算机之间的数据传输和交换提供了必需的手段,而计算机技术又渗透到了通信领域,提高了通信网络的性能。 计算机网络的…

【谈一谈】: 我们工作中的单例模式有哪些写法?

单例模式的多种写法 我们要实现一个单例,首先最重要的是什么? 当然是把构造函数私有化,变成private类型,(为啥? 单例单例,如果谁都能通过构造函数创建对象,还叫单例吗?是不~) 嗯~我们构造函数私有化后,我们应该操作啥呢? 接着我们需要提供一个方法,这个方法要保证初始化有且…

数据脱敏(六)脱敏算法-加密算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 "加密脱敏"是一种数据处理技术,主要用于保护个人隐私和数据安全。它通过将敏感信息(如姓名、身份证号、电话号码等)进行加密处理,使其无法…

阿里同学聊测试开发与测试平台

在一线大厂,没有测试这个岗位,只有测开这个岗位,即使是做业务测试,那么你的title也是测开。 所以想聊一聊测开的看法,但不代表这是正确的看法,仅供参考。 没来阿里之前我对测开的看法 一直以为专职做自动…

DIcom调试Planar configuration

最近和CBCT组同事调dicom图像 这边得图像模块老不兼容对方得dicom文件。 vtk兼容,自己写得原生解析不兼容。 给对方调好了格式,下次生成文件还会有错。 简单记录下,日后备查。 今天对方又加了 个字段:Planar configuration 查…

【常识】大数据设计基础知识

底层存储:hadoop(hdfsmapreduce) Hadoop已经有十几年的历史,它是大数据领域的存储基石,HDFS目前仍然没有成熟替代品;MapR 文件系统在业内已经具有一定知名度了,不仅 MapR 宣布它自己的文件系统比 HDFS 快2-…

【Unity】【VRTK】【VR开发】同时保持高效打包和调试的VRTK项目设置方式

【背景】 开发功能时希望能够快速调试,在Preview和开发编辑器间流畅切换。后期又希望快速打包到目标安卓平台,感受头盔内部的画面和操作效果。麻烦在于,这两者往往不是明确区分的,很可能一会儿只是想快速验证一下某些功能动作&am…

二进制搭建 Kubernetes

实验流程 k8s集群master01:192.168.75.10 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02:192.168.80.20 k8s集群node01:192.168.75.20 kubelet kube-proxy docker k8s集群node02:192.168.…

Out of memory,realloc failed

git config --global http.postBuffer 1048576000

多线程相关(2)

线程池 构造函数处理过程拒绝策略JDK 内置的拒绝策略 Executors类实现线程池线程池大小设置 通过复用已创建的线程,降低资源损耗、线程可以直接处理队列中的任务加快响应速度、同时便于统一监控和管理。 构造函数 /*** 线程池构造函数7大参数*/ public ThreadPoolE…

opencv鼠标操作与响应

//鼠标事件 Point sp(-1, -1); Point ep(-1, -1); Mat temp; static void on_draw(int event, int x, int y, int flags, void *userdata) {Mat image *((Mat*)userdata);if (event EVENT_LBUTTONDOWN) {sp.x x;sp.y y;std::cout << "start point:"<<…

动态住宅IP代理是什么意思,与静态住宅IP代理的区别和比较

动态住宅IP代理是一种不断变化的IP地址解决方案&#xff0c;用于提高在线安全性、绕过地理限制并进行高级数据挖掘。与静态住宅IP代理相比&#xff0c;动态IP提供更高的匿名性和灵活性&#xff0c;但也有其独特的局限性和成本。我们旨在为您提供一个全面的视角&#xff0c;让您…

LocalSend跨设备传输文件传输协议 v2

LocalSend仓库地址&#xff1a;GitHub - localsend/localsend: An open-source cross-platform alternative to AirDrop LocalSend 协议 v2 English | 简体中文 主要为了实现一个不依赖于任何外部服务器的简单 REST 协议。 因为计算机网络比较复杂&#xff0c;因此我们不能假…

Java实现假日旅社管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…