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

这篇具有很好参考价值的文章主要介绍了RocketMQ JVM/OS配置与订阅关系一致。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、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,符合订阅关系一致原则。

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

正确示例代码一

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。

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

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

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

错误示例代码二

  • 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:文章来源地址https://www.toymoban.com/news/detail-454001.html

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

到了这里,关于RocketMQ JVM/OS配置与订阅关系一致的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Sprint Cloud Stream整合RocketMq和websocket实现消息发布订阅

    1. 引入RocketMQ依赖 :首先,在 pom.xml 文件中添加RocketMQ的依赖: 2. 配置RocketMQ连接信息 :在 application.properties 或 application.yml 中配置RocketMQ的连接信息,包括Name Server地址等: 3.消息发布组件 4.消息发布控制器 项目结构: 接下来是websocket模块的搭建 1. 依赖添加 2.application.yml配

    2024年02月08日
    浏览(36)
  • AzureAD 中 订阅,租户,账户之间的关系

    微软提供了组织、订阅、许可证和用户帐户的层次结构,以便在其云产品中一致使用身份和账单 租户与Azure相关,指的是Azure Active Directory的单个实例,或者通常被称为“Azure AD”。Azure AD是Microsoft的云平台的关键部分,因为它提供了一个单一的位置来管理用户、组以及他们所

    2024年02月06日
    浏览(43)
  • 推荐一个拥有386万订阅者,10000多免费学习视频的频道

    自从开始搞YouTube中文配音以来,我们一直是7*24小时,夜以继日的在批量处理一些优质的学习资源,一方面是翻译,另一方面是配音。这样用户在打开的时候,就能获得经过我们优化的翻译和配音了。 这次我们刚刚处理完一个油管上非常火爆的​IT类学习频道: Edureka 。 该频

    2024年02月08日
    浏览(36)
  • Redis 专栏、JVM 专栏、RocketMQ 专栏、ZooKeeper 专栏文章导读

    欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景 、 中间件系列笔记 和 编程高频电子书 ! 文章导读地址:点击查看文章导读! 感谢你的关注! 下边这

    2024年02月02日
    浏览(40)
  • 微服务事务处理:CAP 定理和最终一致性的关系

    CAP 定理和最终一致性 CAP 定理和最终一致性是两个密切相关的概念,但它们在范围和细节上有所不同。以下是比较: CAP 定理 **正式陈述:**在分布式系统中,最多只能同时满足以下三个保证中的两个:一致性、可用性和分区容错性。 解释: **一致性:**每个读取都检索到最新

    2024年02月03日
    浏览(45)
  • jvm、jre、jdk的关系

    jvm Java 虚拟机(JVM)是 运行 Java 字节码 的虚拟机。 jre JRE(Java Runtime Environment) 是 Java 运行时环境 。它是运行已编译 Java 程序所需的所有内容的集合,主要包括 Java 虚拟机(JVM)、Java 基础类库(Class Library)。 jdk JDK(Java Development Kit),它是功能齐全的 Java SDK,是提供给开

    2024年02月19日
    浏览(36)
  • jdk、jre和jvm的关系

    JDK 是Java开发工具包,它提供了开发Java应用程序所需的工具和库。JDK包括JRE,以及用于编译、调试和运行Java代码的编译器(javac)、调试器(jdb)和其他开发工具。JDK还包含了Java标准类库和其他用于开发Java应用程序的工具。 JRE 是Java运行时环境,它是Jav1a程序在计算机上运行

    2024年02月16日
    浏览(39)
  • 【秒懂JDK,JRE,JVM的关系】

      🌠作者:@TheMythWS. 🎇座右铭:不走心的努力都是在敷衍自己,让自己所做的选择,熠熠发光。  ​ 先用一张图来直观感受 JDK JRE JVM之间的关系 : 先说JDK和JRE: 首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Enviroment)是Java的运行

    2024年02月03日
    浏览(45)
  • 【Azure】微软 Azure 基础解析(五)核心体系结构之管理组、订阅、资源和资源组以及层次关系

    本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中。 本系列文章列表如下: 【Azure】微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx 【Azure】微软 Azure 基础解析(四)Azure核心体系结构组件之数据中心、区域与区域

    2024年02月07日
    浏览(59)
  • JVM、JRE、JDK三者之间的关系

     JVM、JRE和JDK是与Java开发和运行相关的三个重要概念。    再了解三者之前让我们先来了解下java源文件的执行顺序:  使用编辑器或IDE(集成开发环境)编写Java源文件.即demo.java 程序必须编译为字节码文件,javac(Java编译器)编译源文件为demo.class文件. 类文件可在任何平台/操作系

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包