Rocket MQ详解

news2024/11/25 0:43:59

Rocket MQ

一,是啥,从哪来

RocketMQ是一个开源的分布式消息中间件,最初由阿里巴巴集团开发。它的设计目标是为了在高并发、高吞吐量的场景下,实现可靠的消息传输,并且具有良好的可伸缩性和可扩展性。

RocketMQ支持多种消息模式,包括同步、异步、单向和定时消息。同时,RocketMQ还具有高度可靠性、低延迟、高吞吐量、分布式部署等优点,可以在众多领域中广泛应用,比如电商、金融、物流等。

RocketMQ目前已经成为了Apache软件基金会下的顶级开源项目之一,并得到了全球广泛的应用和认可。

消息模型

简单消息模型:

在这里插入图片描述

RocketMQ拓展后的消息模型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Spj6LdI6-1681464097788)(https://rocketmq.apache.org/zh/assets/images/RocketMQ%E5%9F%BA%E6%9C%AC%E6%A8%A1%E5%9E%8B-ebcf3458d04b36f47f4c9633c1e36bf7.png)]

ps:

  • 相同的ConsumerGroup下的消费者主要有两种负载均衡模式,即广播模式,和集群模式(图中是最常用的集群模式)。
  • 在集群模式下,同一个 ConsumerGroup 中的 Consumer 实例是负载均衡消费,如图中 ConsumerGroupA 订阅 TopicA,TopicA 对应 3个队列,则 GroupA 中的 Consumer1 消费的是 MessageQueue 0和 MessageQueue 1的消息,Consumer2是消费的是MessageQueue2的消息。
  • 在广播模式下,同一个 ConsumerGroup 中的每个 Consumer 实例都处理全部的队列。需要注意的是,广播模式下因为每个 Consumer 实例都需要处理全部的消息(如图中ConsumerGroup B),因此这种模式仅推荐在通知推送、配置同步类小流量场景使用。

二,能干啥

RocketMQ是一款高可靠、高吞吐量、可伸缩、易于部署和管理的分布式消息中间件,可以用来实现消息的异步传输、解耦、削峰填谷等功能。具体来说,RocketMQ可以用于以下场景:

  1. 事件驱动架构:RocketMQ可以用来将事件异步传输到订阅者,从而实现事件驱动架构,降低系统的耦合度,提高系统的可扩展性和可维护性。
  2. 流式计算:RocketMQ可以用来传输实时流式数据,如日志、监控数据、交易数据等,用于流式计算和实时数据分析。
  3. 异步处理:RocketMQ可以用来实现异步处理,将一些耗时的任务转移到异步线程或者其他服务中执行,从而提高系统的吞吐量和性能。
  4. 削峰填谷:RocketMQ可以用来实现消息队列的削峰填谷功能,当系统承受的请求量超过了系统的处理能力时,可以将请求转化为消息,通过RocketMQ进行缓存,等待系统恢复正常后再进行处理。
  5. 分布式事务:RocketMQ提供了基于消息的分布式事务支持,可以保证消息在多个节点之间的原子性和一致性。

总之,RocketMQ是一款功能强大的分布式消息中间件,适用于各种场景下的消息传输和异步处理。

RocketMQ强调的就是一个低延迟,高可靠性,高吞吐量的特点。

三,同类产品有哪些

  1. ActiveMQ(2004):Apache ActiveMQ是一个基于JMS协议的开源消息中间件,使用Java语言编写,可以用于构建分布式系统和企业应用。ActiveMQ支持多种协议,包括OpenWire、Stomp、AMQP、MQTT等,同时也提供了REST和WebSocket接口,支持消息持久化和事务等特性。
  2. RabbitMQ(2007):RabbitMQ是一个基于AMQP协议的开源消息中间件,使用Erlang语言编写,具有高性能和可扩展性。RabbitMQ支持多种语言客户端,包括Java、Python、Ruby等,支持消息持久化和事务等特性,同时也支持消息的确认和重传机制。插件支持顺序消息。
  3. Kafka(2011):Kafka是一个分布式的高吞吐量消息队列系统,使用Scala语言编写,由LinkedIn公司开发。Kafka的设计理念是基于发布/订阅模式的消息系统,支持多个消费者并行消费同一个Topic的消息,同时支持水平扩展和数据持久化等特性。
  4. RocketMQ(2012):RocketMQ是阿里巴巴开源的分布式消息中间件,使用Java语言编写,支持消息顺序性和高可用性。RocketMQ的设计理念是基于Topic和Tag来实现消息的路由,同时支持批量发送和消息事务等特性,适用于大规模的分布式系统和实时数据处理场景。

四,同类产品对比

MQ产品性能集群部署顺序消息定时消息消息存储开发语言
ActiveMQ低,数据量大时更甚管理起来较复杂支持,通过exclusive consumer(独有消费者)和message group(同一个组的发给同一个consumer)来实现支持支持使用JDBC和高性能日志的快速持久性,如levelDB、kahaDB。Java
RabbitMQ低,数据量大时更甚不支持支持(单个队列)支持(需要引入插件来支持)Erlang语言自带的Mnesia数据库或者通过插件支持Mysql,PostageSqlErlang
Kafka高吞吐量,低延迟支持分布式部署和水平拓展不支持不支持磁盘和内存混合。Kafka将消息存储在磁盘上的一个或多个日志文件中,同时使用内存缓存来提高读写性能和吞吐量Scala
RocketMQ高可靠性、高吞吐量、低延迟,适用于高并发、大规模的数据处理场景。支持分布式部署和水平扩展支持(一组顺序性的消息发送至同一台broker中的同一个队列中)支持CommitLog,该存储方式将消息持久化到磁盘上,同时使用内存映射技术加速读写操作。CommitLog以消息队列的形式存储消息,支持多种索引方式,包括哈希索引、时间索引等。RocketMQ还支持使用外部存储服务来存储消息,如Hadoop、MySQL、MongoDB等。Java

五,原理

RocketMQ的实现原理可以分为以下几个方面:

  1. 架构设计:RocketMQ的架构分为四层,分别是客户端、Broker、NameServer和存储层。客户端和Broker之间通过网络通信来传递消息,NameServer负责维护Broker的元数据信息,存储层则负责实际存储消息。
  2. 消息存储:RocketMQ使用CommitLog存储消息,即将消息追加到磁盘上的文件中。每个Broker节点上都有一个或多个CommitLog文件,每个文件分为多个固定大小的消息存储段,每个存储段包含多条消息,每条消息由消息长度、消息内容和消息属性三部分组成。
  3. 消息路由:RocketMQ通过Topic和Tag来实现消息的路由,Producer发送消息时需要指定消息所属的Topic和Tag,Broker根据Topic和Tag将消息分发到相应的Consumer。每个Topic可以有多个Tag,每个Consumer可以订阅一个或多个Topic和Tag的消息。
  4. HA机制:RocketMQ通过主从复制的方式实现高可用性,即每个Broker节点都有一个Master节点和多个Slave节点。Master节点负责接收Producer的消息和向Consumer发送消息,同时将消息同步到Slave节点上,Slave节点用于备份和容灾。当Master节点宕机时,会自动切换到Slave节点继续服务。
  5. 消息顺序保证:RocketMQ可以通过顺序消息的方式来保证消息的顺序,即Producer发送的顺序消息在Broker上存储和消费时都保持顺序不变。RocketMQ通过Topic和Message Queue来实现顺序消息,每个Message Queue只能由一个Consumer消费,Producer发送的所有消息都会按照顺序写入同一个Message Queue中,Consumer则按照顺序消费该Queue中的消息。

总的来说,RocketMQ的实现原理主要包括了消息存储、消息路由、HA机制、消息顺序保证等方面,这些技术手段使得RocketMQ具备了高性能、高可靠性和高可扩展性的特点。

六,如何使用

部署模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PnMjKfqx-1681464097789)(https://rocketmq.apache.org/zh/assets/images/RocketMQ%E9%83%A8%E7%BD%B2%E6%9E%B6%E6%9E%84-ee0435f80da5faecf47bca69b1c831cb.png)]

ps:NameServer作用

  1. 管理Broker,每个Broker都会注册到一个NameServer中,并定时发送心跳,NameServer提供心跳检测机制,检查Broker是否还存活。
  2. 管理路由信息,每个NameServer将保存关于整个Broker集群的整个路由信息和用于客户端查询的队列信息。Product和Consumer通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。

部署组件

Broker,NameServer,Provider,Consumer

部署过程

目的:在一台linux服务器下部署一个Master+slaver节点的RocketMQ,并在springboot项目中使用它。

  1. 下载并安装RocketMQ

    可以从RocketMQ的官网(http://rocketmq.apache.org/)下载所需版本的安装包,解压后得到RocketMQ的安装目录。将安装目录复制到服务器上的合适位置,比如/usr/local/rocketmq

  2. 修改配置文件

    /usr/local/rocketmq/conf目录下,复制broker.conf文件并将其重命名为broker-a.properties(作为Master节点的配置文件)和broker-b.properties(作为Slave节点的配置文件)。在两个配置文件中,需要修改的主要配置项包括:

    • brokerName:设置Broker名称,可以自定义。
    • brokerId:设置Broker的唯一ID,Master和Slave节点的ID不能相同。
    • namesrvAddr:设置NameServer的地址和端口,格式为<name-server-ip>:9876
    • listenPort:设置Broker的监听端口,Master和Slave节点的端口不能相同。

    例:

    broker-master.properties:

    # Master节点配置
    brokerName=master
    brokerId=0
    namesrvAddr=localhost:9876
    listenPort=10911
    brokerRole=SYNC_MASTER
    

    broker-slave.properties:

    # Slaver节点配置
    brokerName=slaver
    brokerId=1
    namesrvAddr=localhost:9876
    listenPort=10912
    brokerRole=SLAVE
    
  3. 启动NameServer

    在命令行中执行以下命令来启动NameServer:

    cd /usr/local/rocketmq/bin
    nohup sh mqnamesrv &
    
  4. 启动Master和Slave节点

    在命令行中执行以下命令来启动Master和Slave节点:

    cd /usr/local/rocketmq/bin
    nohup sh mqbroker -c ../conf/broker-master.properties &
    nohup sh mqbroker -c ../conf/broker-slave.properties &
    

    这将启动两个节点,并将Master节点和Slave节点进行绑定。

    查看日志的地方:

    当前文件夹下的nohup.out或者~/logs/rocketmqlogs文件下。
    
  5. 验证节点状态

    执行以下命令来查看节点状态:

    cd /usr/local/rocketmq/bin
    sh mqadmin clusterList -n <name-server-ip>:9876
    

    如果节点正常启动,将输出Master和Slave节点的信息。

  6. 在Spring Boot项目中使用RocketMQ

    首先需要添加RocketMQ的依赖,在pom.xml文件中加入以下依赖:

    <dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-spring-boot-starter</artifactId>
        <version>${rocketmq.version}</version>
    </dependency>
    

    在Spring Boot项目的配置文件中,需要添加以下配置项:

    rocketmq.name-server=192.168.1.100:9876
    

    其中192.168.1.100:9876是RocketMQ的NameServer地址和端口。

    在需要使用RocketMQ的类中,可以使用@RocketMQMessageListener注解来监听消息:

    @Service
    @RocketMQMessageListener(topic = "my-topic", consumerGroup = "my-consumer-group", selectorExpression = "my-tag")
    public class MyRocketMQListener implements RocketMQListener<String> {
        @Override
        public void onMessage(String message) {
            // 处理消息
        }
    }
    

    其中topic表示要监听的主题

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

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

相关文章

杨志丰:一文详解,什么是单机分布式一体化?

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 3 月 25 日&#xff0c;第一届 OceanBase 开发者大会在北京举行&#xff0c;OceanBase 首席架构师杨志丰&#xff08;花名&#xff1a;竹翁&#xff09;带来了 《OceanBase 的单机分布式一体化》 的…

【分享】如何移除PDF密码?

相信不少小伙伴在工作的时候&#xff0c;经常会为了保证PDF文档的安全和私密而给文件设置“打开密码”&#xff0c;但如果后续需要频繁使用该文件&#xff0c;每次打开都要查找输入密码&#xff0c;就会使得工作效率大大降低耽误工作时间。那后续不需要设置保护了&#xff0c;要…

【深度学习】nvidia-smi 各参数意义

文章目录前言1.重点概念解析2.限制GPU显卡功率前言 一个服务器遇到问题了&#xff0c;GPU Fan 和 Perf 两个都是err。之前没遇到这个问题&#xff0c;所以这次机会要搞搞清楚。每个参数都是在干事&#xff0c;能够收到哪些hint&#xff0c;如何查问题。 --------------------…

充电桩测试设备TK4860C交流充电桩检定装置

TK4860C是一款在交流充电桩充电过程中实时检测充电电量的充电桩测试标准仪器&#xff0c;仪器以新能源车为负载&#xff0c;结合宽动态范围测量技术、电能ms级高速刷新等技术&#xff0c;实现充电全过程的累积电能精准计量&#xff0c;相比于传统的预设检定点的稳态计量&#x…

攻防世界Web_php_include

php文件包含题 启动场景 进行代码审计&#xff1a; 对get类型参数进行循环过滤字符串php://&#xff0c;所以考虑其他伪协议&#xff0c;伪协议详见PHP伪协议详解_Snakin_ya的博客-CSDN博客 show_source() 函数 str_replace() 函数 strstr() 函数 方法一 使用data协议 da…

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透

文章目录前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面转载自远程内网穿透的文章&#xff1a;Linux使用宝塔面板搭建网站&#xff0c;并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#xf…

淘宝模拟登录 +淘宝商品详情数据、淘宝商品列表数据爬取

PYTHON环境&#xff1a; * requests库 * time库 * re库 实现思路&#xff1a; * 检查此账号需不需要验证&#xff08;滑动验证/验证码&#xff09; * 浏览器/工具 获取ua和加密后的密码(一劳永逸的方法) * post请求登录url获取st申请url * 根据获得的st申请地址获取st…

Session详解(重点)

类似于去服务器注册账号&#xff0c;只要服务器不停机&#xff0c;自己注册的账号一直会存在服务器。 什么是Session&#xff1a; 1.服务器会给每一个用户&#xff08;浏览器&#xff09;创建一个对象&#xff1b; 2.一个Session独占一个浏览器&#xff0c;只要浏览器没有关…

如何高效清洗数据?试试这款神器

在大数据时代&#xff0c;数据的来源具有多样性、复杂性。 针对数量庞大、渠道及格式多样的数据&#xff0c;数据清洗就成为刚需。 在数据分析中&#xff0c;数据清洗实际上是十分繁重且关键的一步。 Power Query作为数据清洗的工具&#xff0c;能将这些多源的数据集中并统一…

优化城市布局:地下管网解决方案的应用

城市地下管网是城市基础设施中非常重要的一部分&#xff0c;包括排水系统、供水系统、天然气管道、电缆管道等多种管网。然而&#xff0c;城市地下管网也是一个复杂而庞大的系统&#xff0c;由于年久失修和规划不当等原因&#xff0c;经常出现漏水、爆炸、停电等问题&#xff0…

【Unity入门】10.物体的运动

【Unity入门】物体的运动 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;用脚本驱动物体移动 &#xff08;1&#xff09;制作一台运动的小车 回顾上一篇文章&#xff0c;我们已经可以用脚本…

Allegro thermal relief热风焊盘

为了画个通孔焊盘&#xff0c;看了很久的 Thermal relief相关的内容&#xff0c;终于基本上理解了。记录一下。 这篇文章讲得非常清楚&#xff1a; 深入理解Allegro之Thermal Relief与Anti Pad - 百度文库 (baidu.com) 热风焊盘般用在内层&#xff0c;减少一些焊盘和铜皮的连…

某vm样本的分析

背景 驱动那块&#xff08;MiDeadPteTrackerSListHead&#xff09; 从遥远的东方收到的一个样本&#xff0c;好嘛&#xff01;打开之后一直不停的在创建和结束进程&#xff0c;又是vmp。 还是老方法&#xff0c;dmp下来之后看看&#xff0c;好嘛&#xff0c;main函数被vm了&am…

大数据技术之Hive

第1章Hive基本概念1.1 Hive1.1.1 Hive的产生背景在那一年的大数据开源社区&#xff0c;我们有了HDFS来存储海量数据、MapReduce来对海量数据进行分布式并行计算、Yarn来实现资源管理和作业调度。但是面对海量数据和负责的业务逻辑&#xff0c;开发人员要编写MR来对数据进行统计…

stm32学习第四天

DMA1&#xff1a;各个通道一览 DMA2&#xff1a;各个通道一览 1.stm32DMA相关固件库函数说明 第一个参数选择哪一个DMA的哪一个通道 初始化函数 void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); typedef struct {uint32_t DMA_Periph…

Vue项目中关于全局css的处理

Vue项目中关于全局css的处理步骤一&#xff1a;定义声明全局CSS的样式文件(common.scss)步骤二&#xff1a;挂载到全局封装一&#xff1a;对common.scss拆分封装二&#xff1a;新建index.scss&#xff0c;对elementPlus或者element-ui样式进行覆盖封装三&#xff1a;variable.s…

一、ts学习第一课:环境配置

一、下载node 官网&#xff1a;Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 推荐下载左侧稳点版的node&#xff0c;下载好了&#xff0c;就一步步点击安装就ok了。 判断是否已经下载好了node&#xff0c;在命令行…

BIO和NIO的区别与实现

目录 目标 概述 实战 单线程版本的BIO 多线程版本的BIO 单线程NIO&#xff08;简易版&#xff09; 单线程NIO&#xff08;多路复用版&#xff09; 客户端发送数据的方法 目标 了解BIO和NIO的区别和应用场景。分析BIO和NIO的线程模型&#xff0c;利用Socket实现BIO和NI…

pytorch 笔记

1.python文件、python控制台Terminal、jupyter代码执行比较 2.Dataset和Dataloader dataset存储数据集&#xff0c;dataloader从数据集中批量加载数据&#xff0c;如 把 dataset 放入 DataLoaderloader Data.DataLoader(datasettorch_dataset, # torch TensorDataset forma…

MIPI D-PHYv2.5笔记(17) -- Global Operation Flow Diagram、数据速率依赖参数

声明&#xff1a;作者是做嵌入式软件开发的&#xff0c;并非专业的硬件设计人员&#xff0c;笔记内容根据自己的经验和对协议的理解输出&#xff0c;肯定存在有些理解和翻译不到位的地方&#xff0c;有疑问请参考原始规范看 Global Operation Flow Diagram 图1 Data Lane Mod…