RocketMQ入门

RocketMq详解:一、RocketMQ 介绍及基本概念 Name Server和ZooKeeper的作用大致是相同的,从宏观上来看,Name Server做的东西很少,就是保存一些运行数据,Name Server之间不互连,这就需要broker端连接所有的Name Server,运行数据的改动要发送到每一个Name Server来保证运行数据的一致性(这个一致性确实有点弱),这样就变成了Name Server很轻量级,但是broker端就要做更多的东西了。这种方式优点是数据与服务都没有单点问题,Master 宕机时消息无延迟,服务与数据的可用性非常高。 阅读详情
  • 能够保证严格的消息顺序
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力

一.RocketMQ网络部署特点

    (1)NameServer是一个几乎无状态的节点,可集群部署,节点之间无任何信息同步

    (2)Broker部署相对复杂,Broker氛围Master与Slave,一个Master可以对应多个Slaver,但是一个Slaver只能对应一个Master,Master与Slaver的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slaver。Master可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有的NameServer

    (3)Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Produce完全无状态,可集群部署

    (4)Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slaver建立长连接,且定时向Master、Slaver发送心跳。Consumer即可从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定

二.RocketMQ储存特点

   (1)零拷贝原理:Consumer消费消息过程,使用了零拷贝,零拷贝包括一下2中方式,RocketMQ使用第一种方式,因小块数据传输的要求效果比sendfile方式好

           a )使用mmap+write方式

             优点:即使频繁调用,使用小文件块传输,效率也很高

             缺点:不能很好的利用DMA方式,会比sendfile多消耗CPU资源,内存安全性控制复杂,需要避免JVM Crash问题

        b)使用sendfile方式

             优点:可以利用DMA方式,消耗CPU资源少,大块文件传输效率高,无内存安全新问题

             缺点:小块文件效率低于mmap方式,只能是BIO方式传输,不能使用NIO

    (2)数据存储结构

三.RocketMQ关键特性

1.单机支持1W以上的持久化队列

    (1)所有数据单独储存到commit Log ,完全顺序写,随机读

    (2)对最终用户展现的队列实际只储存消息在Commit Log 的位置信息,并且串行方式刷盘

     这样做的好处:

    (1)队列轻量化,单个队列数据量非常少

    (2)对磁盘的访问串行话,避免磁盘竞争,不会因为队列增加导致IOWait增高

     每个方案都有优缺点,他的缺点是:

    (1)写虽然是顺序写,但是读却变成了随机读

    (2)读一条消息,会先读Consume  Queue,再读Commit Log,增加了开销

    (3)要保证Commit Log 与 Consume  Queue完全的一致,增加了编程的复杂度

     以上缺点如何客服:

    (1)随机读,尽可能让读命中pagecache,减少IO操作,所以内存越大越好。如果系统中堆积的消息过多,读数据要访问硬盘会不会由于随机读导致系统性能急剧下降,答案是否定的。

        a)访问pagecache时,即使只访问1K的消息,系统也会提前预读出更多的数据,在下次读时就可能命中pagecache

        b)随机访问Commit Log 磁盘数据,系统IO调度算法设置为NOOP方式,会在一定程度上将完全的随机读变成顺序跳跃方式,而顺序跳跃方式读较完全的随机读性能高5倍

    (2)由于Consume Queue存储数量极少,而且顺序读,在pagecache的与读取情况下,Consume Queue的读性能与内存几乎一直,即使堆积情况下。所以可以认为Consume Queue完全不会阻碍读性能

    (3)Commit Log中存储了所有的元信息,包含消息体,类似于MySQL、Oracle的redolog,所以只要有Commit Log存在, Consume  Queue即使丢失数据,仍可以恢复出来

2.刷盘策略

rocketmq中的所有消息都是持久化的,先写入系统pagecache,然后刷盘,可以保证内存与磁盘都有一份数据,访问时,可以直接从内存读取

2.1异步刷盘

在有 RAID 卡, SAS 15000 转磁盘测试顺序写文件,速度可以达到 300M 每秒左右,而线上的网卡一般都为千兆网卡,写磁盘速度明显快于数据网络入口速度,那么是否可以做到写完    内存就向用户返回,由后台线程刷盘呢?

(1).  由于磁盘速度大于网卡速度,那么刷盘的进度肯定可以跟上消息的写入速度。

(2).  万一由于此时系统压力过大,可能堆积消息,除了写入 IO,还有读取 IO,万一出现磁盘读取落后情况,会不会导致系统内存溢出,答案是否定的,原因如下:

a)  写入消息到 PAGECACHE 时,如果内存不足,则尝试丢弃干净的 PAGE,腾出内存供新消息使用,策略

是 LRU 方式。

b)  如果干净页不足,此时写入 PAGECACHE 会被阻塞,系统尝试刷盘部分数据,大约每次尝试 32 个 PAGE,

来找出更多干净 PAGE。

综上,内存溢出的情况不会出现

2.2同步刷盘:

同步刷盘与异步刷盘的唯一区别是异步刷盘写完 PAGECACHE 直接返回,而同步刷盘需要等待刷盘完成才返回,同步刷盘流程如下:

    (1)写入 PAGECACHE 后,线程等待,通知刷盘线程刷盘。

    (2)刷盘线程刷盘后,唤醒前端等待线程,可能是一批线程。

    (3)前端等待线程向用户返回成功。

3.消息查询

3.1按照MessageId查询消息

MsgId总共16个字节,包含消息储存主机地址,消息Commit Log Offset。从MsgId中解析出Broker的地址和Commit Log 偏移地址,然后按照存储格式所在位置消息buffer解析成一个完整消息

3.2按照Message Key查询消息

1.根据查询的key的hashcode%slotNum得到具体的槽位置  (slotNum是一个索引文件里面包含的最大槽目数目,例如图中所示 slotNum=500W)

2.根据slotValue(slot对应位置的值)查找到索引项列表的最后一项(倒序排列,slotValue总是指向最新的一个索引项)

3.遍历索引项列表返回查询时间范围内的结果集(默认一次最大返回的32条记录)

4.Hash冲突,寻找key的slot位置时相当于执行了两次散列函数,一次key的hash,一次key的hash取值模,因此这里存在两次冲突的情况;第一种,key的hash值不同但模数相同,此时查询的时候会在比较第一次key的hash值(每个索引项保存了key的hash值),过滤掉hash值不想等的情况。第二种,hash值相等key不想等,出于性能的考虑冲突的检测放到客户端处理(key的原始值是存储在消息文件中的,避免对数据文件的解析),客户端比较一次消息体的key是否相同

5.存储,为了节省空间索引项中存储的时间是时间差值(存储时间——开始时间,开始时间存储在索引文件头中),整个索引文件是定长的,结构也是固定的

4.服务器消息过滤

RocketMQ的消息过滤方式有别于其他的消息中间件,是在订阅时,再做过滤,先来看下Consume Queue存储结构

1.在Broker端进行Message Tag比较,先遍历Consume Queue,如果存储的Message Tag与订阅的Message Tag不符合,则跳过,继续比对下一个,符合则传输给Consumer。注意Message Tag是字符串形式,Consume Queue中存储的是其对应的hashcode,比对时也是比对hashcode

2.Consumer收到过滤消息后,同样也要执行在broker端的操作,但是比对的是真实的Message Tag字符串,而不是hashcode

为什么过滤要这么做?

1.Message Tag存储hashcode,是为了在Consume Queue定长方式存储,节约空间

2.过滤过程中不会访问Commit Log 数据,可以保证堆积情况下也能高效过滤

3.即使存在hash冲突,也可以在Consumer端进行修正,保证万无一失

5.单个JVM进程也能利用机器超大内存

1.Producer发送消息,消息从socket进入java 堆

2.Producer发送消息,消息从java堆进入pagecache,物理内存

3.Producer发送消息,由异步线程刷盘,消息从pagecache刷入磁盘

4.Consumer拉消息(正常消费),消息直接从pagecache(数据在物理内存)转入socket,到达Consumer,不经过java堆。这种消费场景最多,线上96G物理内存,按照1K消息算,可以物理缓存1亿条消息

5.Consumer拉消息(异常消费),消息直接从pagecache转入socket

6.Consumer拉消息(异常消费),由于socket访问了虚拟内存,产生缺页中断,此时会产生磁盘IO,从磁盘Load消息到pagecache,然后直接从socket发出去

7.同5
8.同6

6.消息堆积问题解决办法

堆积性能指标
1 消息的堆积容量 依赖磁盘大小
2 发消息的吞吐量大小受影响程度 无Slave情况,会受一定影响 
有Slave情况,不受影响
3 正常消费的Consumer是否会受影响 无Slave情况,会受一定影响 
有Slave情况,不受影响
4 访问堆积在磁盘的消息时,吞吐量有多大 与访问的并发有关,最终会降到5000左右

在有Slave情况下,Master一旦发现Consumer访问堆积在磁盘的数据时,回想Consumer下达一个重定向指令,令Consumer从Slave拉取数据,这样正常的发消息与正常的消费不会因为堆积受影响,因为系统将堆积场景与非堆积场景分割在了两个不同的节点处理。这里会产生一个问题,Slave会不会写性能下降,答案是否定的。因为Slave的消息写入只追求吞吐量,不追求实时性,只要整体的吞吐量高就行了,而Slave每次都是从Master拉取一批数据,如1M,这种批量顺序写入方式使堆积情况,整体吞吐量影响相对较小,只是写入RT会变长

RocketMQ控制台安装教程 RocketMQ安装教程一文中,详细探讨了如何搭建RocketMQ,这一节来搭建RocketMQ控制台,RocketMQ的可视化管理界面。 一、下载代码 # 方式一、git下载,执行如下命令 git clone https://github.com/apache/rocketmq-externals.git # 方式二、直接下载,访问如下地址即可 https://github.co... 阅读详情

相关推荐

RocketMQ详解(持续更新)

一、MQ阐述 简单图示 [注] 消息队列是一种"先进先出"的数据结构 不使用队列的情况下生产者与消费者之间是通过RPC交互的 应用场景 应用解耦 问题描述 系统的耦合性越高,容错性就越低,以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常 解耦含义 使用消息队列解耦,系统的耦合性就会...

Ferao的博客 6万+

RocketMQ 详解

RocketMQ 详解1. 基础概念2.RocketMQ 消费模式2.1 广播模式2.2 集群模式3. 基础架构3.1 Broker 的存储结构3.2 存储文件简介3.3 Consumer 端的负载均衡机制3.4 消息刷盘机制3.5 Mmap + pageCache3.5.1 传统IO 和 Mmap3.5.2 pageCache3.5.3 预映射机制 + 文件预热机制3.6 push/pull/pop3.7 Topic 分片3.8 查漏补缺3.8.1 消息的全局顺序和局部顺序3.8.2 零拷贝(Zero-c

weixin_44981707的博客 3万+

消息队列RocketMQ入门指南

本次的示例是关于订单系统改造,用户下单完成后,服务器需要进行库存扣减、订单状态更新、以及优惠券、积分等边边角角的业务,如果顺序执行这些逻辑+网络开销,接口耗时对于用户体验是非常不友好的。的开发者,这篇文章都将为你提供一个清晰的入门指南。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。,作为阿里巴巴开源的一款高性能、高可靠的分布式消息中间件,凭借其强大的功能和稳定的性能,成为了众多开发者和企业的首选。

禅与计算机程序设计的艺术 4211

RocketMQ 实战之快速入门

https://www.jianshu.com/p/824066d70da8RocketMQ 实战之快速入门 https://blog.youkuaiyun.com/zhangcongyi420/article/details/82593982java使用rocketMq https://www.cnblogs.com/coder-lzh/p/9006048.htmlRocketMQ在windo...

极客on之路 1778

最新 RocketMQ 入门教程

文章目录一. RocketQM简介1.1 功能作用优点1.2 图示1.3 基本概念二. 下载安装与配置1. 下载安装2. RocketMQ 配置2.1 配置环境变量2.2 本地部署2.2.1 启动RocketMQ2.2.2 启动Broker程序2.2.3 部署RocketMQ插件三. springboot整合RocketMQ3.1 创建spring boot项目3.2 配置pom.xml文件3.3...

星辰里的月光 3719

RocketMQ入门开发

rocketMQTemplate.convertAndSend("rocketmq_10" + ":" + "TAG1", MessageBuilder.withPayload("过滤消息TAG1").build());rocketMQTemplate.convertAndSend("rocketmq_10" + ":" + "TAG2", MessageBuilder.withPayload("过滤消息TAG2").build());

m0_73257876的博客 530

RocketMQ入门教程

RocketMQ是一款简单易上手的消息队列中间件,本文详细介绍了RocketMQ的基础使用流程,基础操作流程,对新手进行消息队列的学习具有很大的帮助。

wywcool的博客 5253

Cadence Allegro 17.4学习记录开始01-原理图Capture CIS 17.4

Orcad的学习记录

qq_31444421的博客 1万+

rocketmq实战入门

rocketmq实战入门 https://blog.youkuaiyun.com/sunqingzhong44/article/details/72854127 https://blog.youkuaiyun.com/jyjy1314/article/details/84918264 https://blog.youkuaiyun.com/u013278314/article/details/82497132

香烟达人的博客 443

算法之动态规划(DP)求解完全背包问题

算法之动态规划(DP)求解01背包问题 上面这篇文章主要讲解了01背包问题和动态规划算法,如果你不了解动态规划算法,建议先浏览一下这篇文章熟悉一下,因为,本文的算法思想是基于这篇文章的。 1、什么是完全背包问题? **01背包问题:**有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品只能取1次放入背包中,背包所有物品权重和最大是多少? 完全背包: 有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品可以取无限次放入背包中,背包所有物品权重和

PRML_MAN的博客 2万+

【Rcode】生存分析: KM & COX回归& 随机森林& nomogram

本文使用了R——survival包下的lung数据进行方法测试: 1)KM 2) Cox回归:多因素 3)随机森林因子(根据cox回归结果) 4)nomogram ( 根据cox回归结果,建立了中位生存时间,1年5年生存率的概率计算) -------------------????????‍♀️本文只有干货,非常干!????----------------------------- 一、数据加载 #生存分析 library("survival") library("survminer") data("

weixin_43172152的博客 9273

RocketMQ快速入门

使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。处于经济考量目的:业务系统正常时段的QPS如果是1000,流量最

我要记录学习博客 772

华为交换机NAC配置避坑指南:搞定打印机、摄像头等哑终端接入(含MAC旁路认证)

本文详细解析华为交换机NAC配置中的MAC旁路认证方案,特别针对打印机、摄像头等哑终端接入问题提供避坑指南。通过对比传统模式与统一模式的配置差异,结合实际案例和典型错误排查,帮助网络工程师高效解决802.1X认证环境下的哑终端接入难题。

weixin_30338497的博客 441

RocketMQ 使用入门案例

SpringCloud Alibaba RocketMQ RocketMQ概述 RocketMQ是一款由阿里研发的高性能高可靠性的分布式消息队列,使用Java语言开发,该项目已经贡献给了Apache基金会,成为Apache的顶级开源项目。 在早期,阿里内部使用ActiveMQ作为其消息传递中间件,随着业务的快速增长,基于ActiveMQ的消息队列集群在处理大规模业务吞吐量时会遇到IO等性能瓶颈,阿里研发团队曾努力优化ActiveMQ,但无奈效果不理想,紧接着他们将目光投向Kafka,不幸的是Kafka并不能

冒险的梦想家的博客~ 2878

Pixel 5 Root, 安装Xposed框架, 解锁5G教程

Pixel 5 5G手机root 教程 前几天买的手机终于到货了,现在又开始折腾了,经过我的努力,现在已经拥有root权限了。

Ender_Zhao的博客 3万+

从零开始理解二极管限幅:5种典型电路设计及实际应用场景解析

本文系统解析了二极管限幅电路的五大经典拓扑,包括串联与并联型上下限幅及双向限幅。通过剖析其核心原理与二极管的单向导电性、正向压降特性,结合ADC输入保护、电源管理、音频处理等实际应用场景,提供了从器件选型到设计陷阱规避的完整实战指南,帮助工程师为信号构建可靠的“安全笼”。

2y3u4i5o6p的博客 1034

RocketMQ-入门搭建超详细

1. MQ介绍 1.1 为什么要用MQ 消息队列是一种“先进先出”的数据结构 其应用场景主要包含以下3个方面 应用解耦 系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。 使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,

黎明小书生 6026

【K210+STM32项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(更新3.0版本)(完整工程资料源码)

STM32F407STM32F407_2(含有app功能)

嵌入式技术开发 2492

一、RocketMQ入门

消息中间件是分布式系统中用于解耦、异步通信的重要组件。本文介绍了RocketMQ的核心概念与使用方式,包括NameServer、Broker、Producer和Consumer等角色,以及Topic、Message Queue等基本概念。重点讲解了三种消息发送方式(同步、异步、单向)和两种消费模式(集群消费和广播消费),并通过代码示例演示了具体实现。

weixin_44063529的博客 874

三维点云转深度图

点云投影过程是将三维点云数据转化为二维图像坐标的关键步骤,它的实现涉及到相机内外参数的计算,包括相机的内部参数(如焦距和主点)和外部参数(如相机位置和方向)。具体来说,可以通过将每个点的三维坐标转换为相机坐标系下的坐标,然后使用相机内部参数和外部参数来计算在二维图像中的坐标。接着计算每个点的深度值,将深度值映射到像素值上,最后创建深度图像并将深度值赋给对应的像素值。这里需要注意的是,在将深度值映射到像素值上时,需要将像素值转换为 uchar 类型,否则在将深度值赋给像素值时会出现类型不匹配的错误。

点云兔子的博客 3171

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 分布式事务:不过是在一致性、吞吐量和复杂度之间,做一个选择
下一篇: 几款消息中间的调研
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值