RocketMQ JVM/OS配置与订阅关系一致

news2024/11/19 10:22:23

一、JVM/OS配置

1 、JVM选项​

推荐使用最新发布的 JDK 版本。通过设置相同的 Xms 和 Xmx 值来防止 JVM 调整堆大小以获得更好的性能。生产环境 JVM 配置如下所示:

-server -Xms8g -Xmx8g -Xmn4g 

当 JVM 是默认 8 字节对齐,建议配置最大堆内存不要超过 32 G,否则会影响 JVM 的指针压缩技术,浪费内存。

如果您不关心 RocketMQ Broker 的启动时间,还有一种更好的选择,就是通过 “预触摸” Java 堆以确保在JVM初始化期间每个页面都将被分配。那些不关心启动时间的人可以启用它:

-XX:+AlwaysPreTouch  

信息

生产环境集群 Broker 一般建议配置足够的内存,避免使用小规格内存机器部署。因为Broker是重度依赖内存PageCache做性能优化的,内存过小可能造成性能不稳定。

禁用偏置锁定可能会减少 JVM 暂停:

-XX:-UseBiasedLocking   

垃圾回收,建议使用 JDK 1.8 自带的 G1 收集器:

-XX:+UseG1GC 
-XX:G1HeapRegionSize=16m   
-XX:G1ReservePercent=25 
-XX:InitiatingHeapOccupancyPercent=30

这些 GC 选项看起来有点激进,但事实证明它在我们的生产环境中具有良好的性能。

另外不要把 -XX:MaxGCPauseMillis 的值设置太小,否则 JVM 将使用一个小的年轻代来实现这个目标,这将导致非常频繁的 minor GC,所以建议使用 rolling GC 日志文件:

-XX:+UseGCLogFileRotation   
-XX:NumberOfGCLogFiles=5 
-XX:GCLogFileSize=30m

如果写入 GC 文件会增加代理的延迟,可以考虑将 GC 日志文件重定向到内存文件系统:

-Xloggc:/dev/shm/mq_gc_%p.log123   

2 、Linux内核参数​

os.sh 脚本在 bin 文件夹中列出了许多内核参数,可以进行微小的更改然后用于生产用途。下面的参数需要注意,更多细节请参考 /proc/sys/vm/*的 文档

  • vm.extra_free_kbytes 告诉 VM 在后台回收(kswapd)启动的阈值与直接回收(通过分配进程)的阈值之间保留额外的可用内存。RocketMQ 使用此参数来避免内存分配中的长延迟。(与具体内核版本相关)
  • vm.min_free_kbytes 如果将其设置为低于 1024 KB,将会巧妙的将系统破坏,并且系统在高负载下容易出现死锁。
  • vm.max_map_count 限制一个进程可能具有的最大内存映射区域数。RocketMQ 将使用 MMAP 加载 CommitLog 和 ConsumeQueue,因此建议将为此参数设置较大的值。
  • vm.swappiness 定义内核交换内存页面的积极程度。较高的值会增加攻击性,较低的值会减少交换量。建议将值设置为 10 来避免交换延迟。
  • File descriptor limits RocketMQ 需要为文件( CommitLog 和 ConsumeQueue )和网络连接打开文件描述符。我们建议设置文件描述符的值为 655350。
  • Disk scheduler RocketMQ建议使用I/O截止时间调度器,它试图为请求提供有保证的延迟。

二、订阅关系一致

前言​

订阅关系是 RocketMQ 领域模型中非常重要的环节,用于表达消费者消费消息的控制元数据,完整的概念请参考订阅关系模型。

订阅关系一致是指,同一个消费者组下所有消费者实例所订阅的Topic、Tag必须完全一致。如果订阅关系(消费者分组名-Topic-Tag)不一致,会导致消费消息紊乱,甚至消息丢失。

1、 正确订阅关系示例​

1.1 订阅的Topic一样,且过滤表达式一致​

如下图所示,同一 ConsumerGroup 下的三个Consumer实例C1、C2和C3分别都订阅了TopicA,且订阅TopicA的Tag也都是Tag1,符合订阅关系一致原则。

正确示例代码一

C1、C2、C3的订阅关系一致,即C1、C2、C3订阅消息的代码必须完全一致,代码示例如下:

        PushConsumer consumer1 = provider.newPushConsumerBuilder().setConsumerGroup("GroupA").build();
        consumer1.subscribe("TopicA", new FilterExpression("TagA", FilterExpressionType.TAG));
        
        PushConsumer consumer2 = provider.newPushConsumerBuilder().setConsumerGroup("GroupA").build();
        consumer2.subscribe("TopicA", new FilterExpression("TagA", FilterExpressionType.TAG));
        
        PushConsumer consumer3 = provider.newPushConsumerBuilder().setConsumerGroup("GroupA").build();
        consumer3.subscribe("TopicA", new FilterExpression("TagA", FilterExpressionType.TAG));

信息

RocketMQ 强调订阅关系一致,核心是指相同 ConsumerGroup 的每个 Consumer 之间一致,因为在服务端视角看来一个 Group 下的所有 Consumer 都应该是相同的副本逻辑。

强调订阅关系一致,并不是指一个 Consumer 不能订阅多个Topic,每个 Consumer 仍然可以按照需要订阅多个 Topic,但前提是相同消费者分组下的 Consumer 要一致。

2、 订阅关系不一致的排查​

问题描述

在使用 Apache RocketMQ 时,可能会出现订阅关系不一致的情况,具体的问题现象如下:

  • Apache RocketMQ 控制台中订阅关系是否一致显示为否。
  • 消费者(Consumer)实例未收到订阅的消息。

请参考以下步骤进行检查

您可在消息Apache RocketMQ的控制台或者CLi工具查看指定Group的订阅关系是否一致。若查询结果不一致,请参见本文(3 常见订阅关系不一致问题)排查Consumer实例的消费代码。

  1. 检查您Consumer实例中与订阅相关的配置代码,确保配置同一个 ConsumerGroup 的所有Consumer实例均订阅相同的Topic及Tag。
  2. 使用控制台或者Cli命令ConsumerConnection 查看生效的订阅关系是否一致。
  3. 测试并确认消息能够被预期的Consumer实例所消费。

3 、常见订阅关系不一致问题​

3.1 同一ConsumerGroup下的Consumer实例订阅的Topic不同(3.x、4.x SDK适用)​

在早期3.x/4.x 版本的SDK中,如下图所示,同一 ConsumerGroup 下的三个Consumer实例C1、C2和C3分别订阅了TopicA、TopicB和TopicC,订阅的Topic不一致,不符合订阅关系一致性原则。

备注

5.x版本SDK 已经支持同一个 ConsumerGroup 下的Consumer实例订阅不同的Topic。

3.2 同一 ConsumerGroup 下的 Consumer 实例订阅的Topic相同,但订阅的Tag不一致​

如下图所示,同一 ConsumerGroup 下的三个Consumer实例C1、C2和C3分别都订阅了TopicA,但是C1订阅TopicA的Tag为Tag1,C2和C3订阅的TopicA的Tag为Tag2,订阅同一Topic的Tag不一致,不符合订阅关系一致性原则。

错误示例代码二

  • Consumer实例2-1:

          PushConsumer consumer1 = provider.newPushConsumerBuilder().setConsumerGroup("GroupA").build();
          consumer1.subscribe("TopicA", new FilterExpression("Tag1", FilterExpressionType.TAG));
    

  • Consumer实例2-2:

          PushConsumer consumer2 = provider.newPushConsumerBuilder().setConsumerGroup("GroupA").build();
          consumer2.subscribe("TopicA", new FilterExpression("Tag2", FilterExpressionType.TAG));
    

  • Consumer实例2-3:

          PushConsumer consumer3 = provider.newPushConsumerBuilder().setConsumerGroup("GroupA").build();
          consumer3.subscribe("TopicA", new FilterExpression("Tag2", FilterExpressionType.TAG));

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

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

相关文章

AI加持的必应,为什么还赢不了谷歌?

“少年屠龙”的故事,似乎还有些遥远。 即使有新必应的加成,微软浏览器Edge在全球市场的占有率依然不高。据Statcounter数据显示,2023年4月,Edge的市场占有率仅为4.97%。提升的速度似乎也不太理想,4月份的数据只比一年…

《Netty》从零开始学netty源码(五十九)之ServerBootstrapAcceptor

ServerBootstrapAcceptor 前面初始化channel的过程中向pipeline中添加了一个channelHandler,即ServerBootstrapAcceptor,它的作用主要是将worker组的channel进行注册,它的数据结构如下: 它的属性主要是通过ServerBootstrap启动类…

07-通过RocketMQ和Redis实现用户动态提醒

1、用户动态表 CREATE TABLE `t_user_moments` (`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键id,`user_id` bigint(12) DEFAULT NULL COMMENT 用户id,`user_type` int(8) DEFAULT NULL COMMENT 动态类型:0视频 1直播 2专栏动态,`contend_id` bigint(12) D…

五个不错的样机素材网站推荐

设计师完成作品后,为了更好地展示作品,通常会将设计作品应用到真实的样机素材模板中。 本文推荐五个不错的样机素材网站,希望对你有所帮助。 1.即时设计 即时设计是一款「专业UI设计工具」,不受平台限制,打开浏览器…

使用JUnit进行单元测试、JUL日志系统配置、Mybatis日志系统配置、Lombok开启日志

文章目录 使用JUnit进行单元测试原因测试断言工具类案例一:错误冒泡排序案例二:从数据库获取数据 Before注解After JUL日志系统使用JUL日志修改日志的打印级别文件处理器控制打印格式日志设置过滤器 Properties配置文件编写日志配置文件使用Lombok快速开…

短信验证码

阿里云短信 1.1 介绍 短信服务(Short Message Service)由阿里云提供短信平台,调用API即可发送验证码、通知类和营销类短信;国内验证短信秒级触达,到达率最高可达99%。 官方网站:https://www.aliyun.com/…

getchar、putchar以及输入缓冲区

目录 1.getchar和putchar的文献 1.1关于getchar的文献: 1.2关于putchar的文献 1.3返回值问题 2.从键盘中输入一个字符 2.1原理💨 🚩2.2如何理解: ❗理解1: ❗理解2: 2.3关于程序如何结束 3.输入密码 3.1调用一次getchar读取相当于…

开发笔记之:文件读取值溢出bug分析(JAVA版)

&#xff08;1&#xff09;引言 以下是Java读取数据文件&#xff08;FileInputStream&#xff09;的代码&#xff1a; /*** 按双字读取* param fis 文件输入流* param isBigEndian 是否大头&#xff08;字节序&#xff09;* return 双字值 | <code>-1</cod…

vue2 axios请求后端数组数据 并展示

目录 1 vue加依赖 --> 终端中install 2 main.js 引入依赖 3 components -> 组件中 如 HelloWorld.vue 中 3.1 中定义数组 并接收数据赋值给数组 3.2 el表格 接收数据数据 并展示出来 4 效果 1 vue加依赖 --> 终端中install npm i axios vue-axiosnpm i element…

Cesium教程(一):Cesium的下载和安装

目录 1、Cesium简介 2、Cesium下载和安装 2.1 下载方式1 2.2 下载方式2 3、Cesium测试 4、我的第一个Ceisum程序《HelloCesium》 1、Cesium简介 首先进入Cesium官网 Cesium 是 3D 地理空间平台Cesium 是软件应用程序的开放平台&#xff0c;旨在释放 3D 数据的力量。用于…

RocketMQ的安装讲解详细手册--------以及启动Broker启动找不到类问题

RocketMQ的安装 1.RocketMQ安装 1.1下载RocKetMQ 下载地址&#xff1a;https://rocketmq.apache.org/release-notes/2017/12/13/4.2.0 下载解压后 bin:可执行文件目录 confidence&#xff1a;配置文件目录 lib:依赖库&#xff0c;是一些jar包 1.1配置ROCKETMQ_HOME 解压…

前端工程化配置

前端工程化配置指南 如何构建一个工程化的前端库&#xff0c;并结合 Github Actions&#xff0c;自动发布到 Github 和 NPM 的整个详细流程。 示例 我们经常看到像 Vue、React 这些流行的开源项目有很多配置文件&#xff0c;他们是干什么用的&#xff1f;他们的 Commit、Releas…

如何利用Jmeter从0到1做一次完整的压测

压测&#xff0c;在很多项目中都有应用&#xff0c;是测试小伙伴必备的一项基本技能&#xff0c;刚好最近接手了一个小游戏的压测任务&#xff0c;一轮压测下来&#xff0c;颇有收获&#xff0c;赶紧记录下来&#xff0c;与大家分享一下&#xff0c;希望大家能少踩坑。 一、压测…

Selenium自动化测试设计模式 —— PO模式

前言&#xff1a; 在python自动化过程中&#xff0c;Selenium自动化测试中有一个名字常常被提及PageObject&#xff08;思想与面向对象的特性相同&#xff09;&#xff0c;通过PO模式可以大大提高测试用例的维护效率。 不了解po设计模式的可自行百度 面向对象的特性&#xf…

Class 05 - 逻辑运算符and,or,not 和 条件语句 if

Class 05 - 逻辑运算符and,or,not 和 条件语句 if 逻辑运算符和条件语句逻辑运算符 and , or , notand 运算符“&”OR 运算符 “|”not 运算符“&#xff01; 案例运用 and , or , notsubset() 筛选数据AND 实例OR 实例NOT 实例混合使用实例 条件语句 ifif 语句else语句els…

五分钟搞懂Web UI自动化测试中的POM设计模式。

今天&#xff0c;我们来聊聊Web UI自动化测试中的POM设计模式。 为什么要用POM设计模式 前期&#xff0c;我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本 线性脚本&#xff08;以快递100网站登录举栗&#xff09;&#xff1a; 使用以上代码&#xff0c;最基础最…

RabbitMQ五种消息模型

文章目录 1.简单消息队列模型2.Work工作队列模型3.发布订阅模型3.1.Fanout广播3.2.Direct路由3.3.Topics通配符 RabbitMQ官方文档 RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型&#xff0c;只不过进行路由的方式不同。 1.简单消息队列模型 简单消息队…

Midjourney提示词资源、使用技巧、艺术家资源网站收录

为了帮助艺术家们使用Midjourney更专业、准确地创作更完美的艺术作品&#xff0c;我们收录了一些Midjourney提示词资源分享、提示词书写技巧、相关专业工具&#xff0c;同时还有一些相关艺术家资源帮艺术家们找到创作灵感。有很多是社区内资深玩家分享的云文档&#xff0c;资源…

【机器视觉3】双目立体视觉模型

双目立体视觉模型 简单模型一般模型 简单模型 假设两个摄像机平行放置于同一高度、光轴平行、成像平面重合、焦距相同、左右图像每一行y坐标方向、大小相同&#xff0c;如下图所示&#xff1a; 由左右成像平面上的点、目标物点、焦距、摄像机中心基线距离的几何关系可以得到&…

MySQL学习指南笔记经典案例句

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 该文章是一篇关于MySQL的一个学习的笔记或是指南&#xff0c;该文章中有很多的经典的案例可进行相应的练习和参考&#xff0c;后期的话会持续更新关于数据库系统方面的文章。 MySQL学…