RocketMQ简介与应用场景

news2024/11/9 9:30:52

简介

RocketMQ是一个由阿里巴巴开源并捐献给Apache的分布式消息中间件,具有高吞吐、低延迟、海量消息堆积等特点,广泛应用于各种分布式系统和大规模数据处理场景。

核心特征

1、高吞吐与低延迟:RocketMQ支持极高的消息吞吐量和极低的消息延迟,确保在大规模数据处理和实时消息传递中表现优异。
2、海量消息堆积:支持单一队列百万级消息、亿级消息堆积,满足大规模消息存储需求。
3、顺序消息:保证消息的顺序性,适用于证券交易、航班登机消息处理等对消息顺序有严格要求的应用场景。
4、事务消息:支持分布式事务消息,确保数据在多个系统间的一致性,适用于订单支付、库存扣减等需要原子性操作的业务。
5、消息重试与死信队列:提供消息重试机制和死信队列,确保消息在消费失败时能够得到妥善处理。
6、高可用性:支持主从复制、多副本等机制,确保消息服务的高可用性。

RocketMQ的 4个核心组件 NameServer、Broker、Producer、Consumer
在这里插入图片描述

NameServer

NameServer是 RocketMQ中的注册中心,负责维护 Broker集群的路由信息,为了高可用,NameServer可以集群部署,需要特别注意:NameServer相互之间不会通信,它们是一种Peer to Peer的对等关系,并且每个 NameServer都保存着所有 Broker的信息。

NameServer的核心功能包括路由注册、路由发现、路由更新等,具体描述如下:当 Broker启动时会向所有的 NameServer注册自身的信息,比如 IP、端口、Topic、Queue等,NameServer会将这些信息存入本地数据表中。

默认情况下,Broker每隔 30s会向 NameServer发送一次心跳包,NameServer接收到心跳包后更新 Broker状态,如果 NameServer在 120s内没有接收到心跳包,会认为 Broker异常,从而剔除该心跳异常的 Broker。

当存在 Producer和 Consumer时,它们默认会每隔 30s定时从 NameServer获取 Broker集群信息并更新本地缓存,然后对 Broker列表进行负载均衡,从而将消息发送给 Broker或者从 Broker获取消息。

Broker

Broker是 RocketMQ中的数据存储节点,负责接收、存储和转发消息。

Broker可以集群部署,每个集群下面可以有多个组(BrokerName一样),每个组还可以主从部署,BrokerId=0 代表主节点,BrokerId=1代表从节点。

Broker的主要职责包括消息接收、消息存储、消息转发、消息索引、负载均衡,具体描述如下:
当 Broker启动时会所有的 NameServer注册信息以及后期定时向 NameServer发送心跳包,当 Broker接收到 Producer发送的消息后,首先会将消息写入 CommitLog(Write ahead log,WAL),然后开启后台线程将 CommitLog上的数据索引写入 write queue,这样可以确保消息持久化到磁盘上。
另外,Broker 会根据消费者的消费模式(推模式或拉模式),主动推送消息或等待消费者拉取消息,为了提高消息的检索速度,Broker还会为消息创建索引,支持快速定位和检索消息。

Producer

Producer是 RocketMQ中的生产者,负责发送消息。

Producer 和 Broker 是通过 Topic这样一个虚拟的概念建立关系的,当创建 Topic后,其实已经建立了 Topic和 Broker的关系,而这个关系的桥梁就是 queue,在 Broker中,有 write queue 和 read queue两种类型。

Producer每隔 30s从 NameServer拉取所有的 Topic以及 Broker信息,当消息发送到 Topic之后,消息首先会被写入一个 CommitLog的日志文件中,然后有后台线程将消息在 CommitLog磁盘上的地址等索引信息写入 write queue。这样,一个 Topic的数据就可以存储在不同的 Broker上,真正达到了数据的分布式存储,即便有部分Broker异常,受影响的数据也局限在这些 Broker上。

Producer发送消息有 3种方式:同步发送、异步发送和单向发送 。
1、同步发送:Producer 发送消息后需要等待 Broker的确认,这种方式保证消息可靠地发送到 Broker,适用于对消息可靠性要求较高的场景,比如金融领域。
2、异步发送:Producer 发送消息后不等待 Broker的确认,而是通过回调函数处理发送结果,该方式可以提高系统的并发性和吞吐量,适用于日志收集,监控报警等场景。
3、单向发送:Producer 仅发送消息,不关心发送结果,也不等待 Broker的确认。这种方式的性能最高,但无法保证消息一定被发送成功,适用于数据采集,实时统计等场景。
消息重试:在消息发送失败时,Producer 可以进行重试,确保消息最终被成功发送。

Consumer

Consumer是 RocketMQ中的消费者,负责消费和处理消息,通常是真实的业务系统,Consumer的整个工作流程描述如下:
当 Consumer启动后,会向 Broker订阅感兴趣的 Topic,当 Topic中的 read queue有消息时,Consumer会定时拉取,然后执行真实的业务逻辑。当 Consumer成功处理消息后,需要向 Broker发送确认信息,Broker收到确认信息标记该消息已消费,避免重复消费,另外,为了防止丢消息,Consumer一般不建议多线程处理。Consumer可以通过顺序消费和并行消费等方式去拉取信息,从而满足不同的业务需求。

因为一个 Topic可以对应不同 Broker上的 read queue,因此,一个 Consumer可以消费不同 Broker上的数据。

应用场景

异步通信
在分布式系统中,通过 RocketMQ实现异步通信可以显著提高系统的响应速度和并发能力。例如,电商系统中订单创建后,通过 RocketMQ将订单数据异步发送给库存系统进行处理,避免了同步调用带来的延迟。

日志收集
RocketMQ可以用于分布式系统的日志收集和分析。各个服务将日志数据发送到 RocketMQ,由专门的日志处理系统进行消费和分析,帮助运维人员监控系统状态和排查故障。

流处理
RocketMQ 结合流处理框架(如 Apache Flink、Apache Storm)可以实现实时数据流处理。例如,在金融领域,通过 RocketMQ收集实时交易数据,并进行实时风控分析。

事件驱动架构

在事件驱动架构中,RocketMQ 作为事件总线,可以实现不同服务之间的解耦。例如,用户注册后发送欢迎邮件、用户订单支付成功后更新用户积分等业务逻辑,都可以通过 RocketMQ进行事件通知和处理。

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

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

相关文章

优思学院|ABC成本方法与精益管理

传统企业计算成本主要基于直接费用。其次的间接费用只需根据某项标准(作业时间等),粗略地将费用分配给各种产品即可。 近来,生产线自动化与间接业务高度复杂化,间接费用在制造成本中的比重越来越高,传统的…

netty编程之那么多的网络框架为啥非选你?

写在前面 java nio框架不止一种,为啥非选netty?本文来看下。 1:正文 网络io框架,除了netty外,还有mina,sun grizzly,cindy等,为啥独选netty。 mina netty和mina作者同属一人&…

【计算机视觉】YoloV8-训练与测试教程

✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 💫 欢迎来到我的学习笔记! 制作数据集 Labelme 数据集 数据集选用自己标注的,可参考以下&#xff1a…

用ArcMap实现可视域分析

在 ArcToolbox>>3D Analyst>>可见性>>视域,输入值如图所示: 设置完成后点击确认,生成可视域分析图层 Viewshe1,由内容列表 可见,红色为不可见,绿色为可见。 改变观察点的高度&#xff1a…

pycharm下载selenium等软件包时提示下载超时

1.问题描述 我今天在pycharm运行刚写的自动化脚本时,提示selenium模块未导入(自动到导入),鼠标移动到【from selenium import webdriver]的selenium时,显示【未存在文档】 2 解决办法 文件--设置--项目:当前…

企业智能培训新方案,高效打造金牌员工

标品市场竞争激烈,小微企业因长期专注于非标业务或者偏定制化路线,在团队专业能力与大型企业间存在显著差距。专业人才短缺、培养成本高企、培训滞后、效果难测、资源不均、考核标准不一及知识转化率低等问题,成为其业务转型的绊脚石。 如何高…

红外热成像应用场景!

1. 电力行业 设备故障检测:红外热成像仪能够检测电气设备(如变压器、电线接头)的过热现象,及时发现并定位故障点,预防火灾等安全事故的发生。 水电站查漏:在水电站中,红外热成像仪可用于快速查…

windows自带的录屏功能好用吗?这4款录屏工具也是不错的选择。

因为现在很多人都会有录屏需求,所以平常使用的一些设备当中会有自带的录屏功能。比如windows10系统下只要按下键盘上的 “WinG” 键,就可打开录屏功能。但是录制的时长会有限制,并且录屏功能会有些限制。如果对录屏有更多的需求,可…

网络设备驱动中的调试级别msglevel

网络设备驱动调试级别可以在驱动初始化过程中赋初值,并通过ethtool_ops中.get_msglevel获取,通过.set_msglevel进行设置或修改,并通过如netif_msg_drv这样的宏函数来在需要打印调试信息时进行判断,为真时输出对应级别的调试信息&a…

QT----基于QML的计时器

赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库QT-Timer 学习使用c的listmodel 学习使用了如何用c的listmodel来存储数据. 新建一个TImeListModel类继承自QAbstractListModel class TimeListModel : public QAbstrac…

AIGC基础工具-科学计算和数据处理的重要库NumPy(Numerical Python)简介

文章目录 1. NumPy 的核心概念1.1 ndarray:多维数组对象示例代码 2. NumPy 的数据类型 (dtype)示例代码 3. NumPy 的数组创建方法3.1 使用 array() 创建数组3.2 使用 zeros() 和 ones()3.3 使用 arange() 和 linspace()3.4 使用 random 模块生成随机数组 4. NumPy 数…

AOT源码解析4.3-model主体解析

1.添加参考图像(add_reference_frame) 1.1 生成位置编码和ID编码 具体操作见详情。 图1:如图所示,显示的是参考图像的位置编码和id编码的生成过程。对于id编码,将mask图像输入进conv2d卷积网络后,进行结…

容器化安装Jenkins部署devops

基础环境介绍 系统使用的是centos7.9 内核使用的是5.16.13-1.el7.elrepo.x86_64 容器使用的是26.1.4 docker-compose使用的是 v2.29.0 链路图 devops 配置git环境插件 部署好jenkins后开始配置 jenkins连接git,这里需要jenkins有连接git的插件。在已安装的插件…

【SD教程】图片也能开口说话?别惊讶!用SadTalker插件,一键生成自己的数字人,本地部署,免费使用!(附资料)

最近数字人越来越火,连互联网大佬都纷纷下场,比如360的周鸿祎,京东的刘强东等等。小伙伴可能也想拥有自己的数字人如果想用最简单的方式,那么可以用第三方的网站,例如 HeyGen平台、腾讯的智影等等。可这些网站都是收费…

HFSS中看TDR波形详细设置以及相关的解释

时域反射测量(TDR)中心思想就是用阶跃函数作为激励,应用在模型上,并检查反射随时间的变化。在检查时域之前,必须对driven solution(Modal、Terminal或Transient)执行插值扫描。然后,…

vite分目录打包以及去掉默认的.gz 文件

1.vite打包情况介绍: 1.1vite在不进行任何配置的情况下,会将除开public的所有引用到资源打包编译添加哈希值至assets文件夹中(非引用文件以及行内样式图片未被打包编译资源会被treeSharp直接忽略不打包),     1.2w…

阿里云函数计算 x NVIDIA 加速企业 AI 应用落地

作者:付宇轩 前言 阿里云函数计算(Function Compute, FC)是一种无服务器(Serverless)计算服务,允许用户在无需管理底层基础设施的情况下,直接运行代码。与传统的计算架构相比,函数…

极星Polestar EDI 项目案例

近期国内汽车行业供应商J公司收到了极星Polestar的邀请,需要通过EDI与其国内工厂传输业务数据。本案例将为大家介绍对接过程以及实施方案。 梳理需求文档 极星Polestar的EDI需求与Volvo一样,传输协议选择 OFTP,报文标准为EDIFACT&#xff0…

Swing模拟银行柜台系统

> 这是一个基于JavaSwing实现的模拟银行柜台系统。 > 具有管理员、柜员、客户三种登录角色。 > 支持开户、注册、存取款、转账、汇款、账单查询等功能。 > 本项目适合JAVA初学者作为入门学习项目。 一、部分界面演示 二、基础依赖 技术/框架版本描述Java11编…

Vue前端浏览器指纹获取:数字世界的身份密码

程序员必备宝典https://tmxkj.top/#/一个开源的JavaScript库,它通过收集用户浏览器的多种属性(如屏幕分辨率、浏览器插件、字体、Canvas和WebGL等)来生成一个独特的浏览器指纹,用于识别和追踪用户。 #Github地址 GitHub - finger…