RocketMQ消息队列的最佳实践

本文详细介绍了RocketMQ中的Broker配置参数,NameServer功能,以及客户端(生产者和消费者)的配置,包括寻址方式和公共配置选项。同时涉及了JVM和Linux内核参数对性能的影响,以及Java开发者的学习资源推荐。
摘要由CSDN通过智能技术生成

3.3 Broker 配置

| 参数名 | 默认值 | 说明 |

| — | — | — |

| listenPort | 10911 | 接受客户端连接的监听端口 |

| namesrvAddr | null | nameServer 地址 |

| brokerIP1 | 网卡的 InetAddress | 当前 broker 监听的 IP |

| brokerIP2 | 跟 brokerIP1 一样 | 存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性,broker 从节点会连接主节点配置的 brokerIP2 进行同步 |

| brokerName | null | broker 的名称 |

| brokerClusterName | DefaultCluster | 本 broker 所属的 Cluser 名称 |

| brokerId | 0 | broker id, 0 表示 master, 其他的正整数表示 slave |

| storePathCommitLog | $HOME/store/commitlog/ | 存储 commit log 的路径 |

| storePathConsumerQueue | $HOME/store/consumequeue/ | 存储 consume queue 的路径 |

| mappedFileSizeCommitLog | 1024 * 1024 * 1024(1G) | commit log 的映射文件大小 |

| deleteWhen | 04 | 在每天的什么时间删除已经超过文件保留时间的 commit log |

| fileReservedTime | 72 | 以小时计算的文件保留时间 |

| brokerRole | ASYNC_MASTER | SYNC_MASTER/ASYNC_MASTER/SLAVE |

| flushDiskType | ASYNC_FLUSH | SYNC_FLUSH/ASYNC_FLUSH SYNC_FLUSH 模式下的 broker 保证在收到确认生产者之前将消息刷盘。ASYNC_FLUSH 模式下的 broker 则利用刷盘一组消息的模式,可以取得更好的性能。 |

4 NameServer


​RocketMQ 中,Name Servers 被设计用来做简单的路由管理。其职责包括:

  • Brokers 定期向每个名称服务器注册路由数据。

  • 名称服务器为客户端,包括生产者,消费者和命令行客户端提供最新的路由信息。

5 客户端配置


​ 相对于RocketMQ的Broker集群,生产者和消费者都是客户端。本小节主要描述生产者和消费者公共的行为配置。

5.1 客户端寻址方式

RocketMQ可以令客户端找到Name Server, 然后通过Name Server再找到Broker。如下所示有多种配置方式,优先级由高到低,高优先级会覆盖低优先级。

  • 代码中指定Name Server地址,多个namesrv地址之间用分号分割

producer.setNamesrvAddr(“192.168.0.1:9876;192.168.0.2:9876”);

consumer.setNamesrvAddr(“192.168.0.1:9876;192.168.0.2:9876”);

  • Java启动参数中指定Name Server地址

-Drocketmq.namesrv.addr=192.168.0.1:9876;192.168.0.2:9876

  • 环境变量指定Name Server地址

export NAMESRV_ADDR=192.168.0.1:9876;192.168.0.2:9876

  • HTTP静态服务器寻址(默认)

客户端启动后,会定时访问一个静态HTTP服务器,地址如下:http://jmenv.tbsite.net:8080/rocketmq/nsaddr,这个URL的返回内容如下:

192.168.0.1:9876;192.168.0.2:9876

客户端默认每隔2分钟访问一次这个HTTP服务器,并更新本地的Name Server地址。URL已经在代码中硬编码,可通过修改/etc/hosts文件来改变要访问的服务器,例如在/etc/hosts增加如下配置:

10.232.22.67 jmenv.taobao.net

推荐使用HTTP静态服务器寻址方式,好处是客户端部署简单,且Name Server集群可以热升级。

5.2 客户端配置

DefaultMQProducer、TransactionMQProducer、DefaultMQPushConsumer、DefaultMQPullConsumer都继承于ClientConfig类,ClientConfig为客户端的公共配置类。客户端的配置都是get、set形式,每个参数都可以用spring来配置,也可以在代码中配置,例如namesrvAddr这个参数可以这样配置,producer.setNamesrvAddr(“192.168.0.1:9876”),其他参数同理。

1 客户端的公共配置

| 参数名 | 默认值 | 说明 |

| — | — | — |

| namesrvAddr | | Name Server地址列表,多个NameServer地址用分号隔开 |

| clientIP | 本机IP | 客户端本机IP地址,某些机器会发生无法识别客户端IP地址情况,需要应用在代码中强制指定 |

| instanceName | DEFAULT | 客户端实例名称,客户端创建的多个Producer、Consumer实际是共用一个内部实例(这个实例包含网络连接、线程资源等) |

| clientCallbackExecutorThreads | 4 | 通信层异步回调线程数 |

| pollNameServerInteval | 30000 | 轮询Name Server间隔时间,单位毫秒 |

| heartbeatBrokerInterval | 30000 | 向Broker发送心跳间隔时间,单位毫秒 |

| persistConsumerOffsetInterval | 5000 | 持久化Consumer消费进度间隔时间,单位毫秒 |

2 Producer配置

| 参数名 | 默认值 | 说明 |

| — | — | — |

| producerGroup | DEFAULT_PRODUCER | Producer组名,多个Producer如果属于一个应用,发送同样的消息,则应该将它们归为同一组 |

| createTopicKey | TBW102 | 在发送消息时,自动创建服务器不存在的topic,需要指定Key,该Key可用于配置发送消息所在topic的默认路由。 |

| defaultTopicQueueNums | 4 | 在发送消息,自动创建服务器不存在的topic时,默认创建的队列数 |

| sendMsgTimeout | 10000 | 发送消息超时时间,单位毫秒 |

| compressMsgBodyOverHowmuch | 4096 | 消息Body超过多大开始压缩(Consumer收到消息会自动解压缩),单位字节 |

| retryAnotherBrokerWhenNotStoreOK | FALSE | 如果发送消息返回sendResult,但是sendStatus!=SEND_OK,是否重试发送 |

| retryTimesWhenSendFailed | 2 | 如果消息发送失败,最大重试次数,该参数只对同步发送模式起作用 |

| maxMessageSize | 4MB | 客户端限制的消息大小,超过报错,同时服务端也会限制,所以需要跟服务端配合使用。 |

| transactionCheckListener | | 事务消息回查监听器,如果发送事务消息,必须设置 |

| checkThreadPoolMinSize | 1 | Broker回查Producer事务状态时,线程池最小线程数 |

| checkThreadPoolMaxSize | 1 | Broker回查Producer事务状态时,线程池最大线程数 |

| checkRequestHoldMax | 2000 | Broker回查Producer事务状态时,Producer本地缓冲请求队列大小 |

| RPCHook | null | 该参数是在Producer创建时传入的,包含消息发送前的预处理和消息响应后的处理两个接口,用户可以在第一个接口中做一些安全控制或者其他操作。 |

3 PushConsumer配置

| 参数名 | 默认值 | 说明 |

| — | — | — |

| consumerGroup | DEFAULT_CONSUMER | Consumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组 |

| messageModel | CLUSTERING | 消费模型支持集群消费和广播消费两种 |

| consumeFromWhere | CONSUME_FROM_LAST_OFFSET | Consumer启动后,默认从上次消费的位置开始消费,这包含两种情况:一种是上次消费的位置未过期,则消费从上次中止的位置进行;一种是上次消费位置已经过期,则从当前队列第一条消息开始消费 |

| consumeTimestamp | 半个小时前 | 只有当consumeFromWhere值为CONSUME_FROM_TIMESTAMP时才起作用。 |

| allocateMessageQueueStrategy | AllocateMessageQueueAveragely | Rebalance算法实现策略 |

| subscription | | 订阅关系 |

| messageListener | | 消息监听器 |

| offsetStore | | 消费进度存储 |

| consumeThreadMin | 10 | 消费线程池最小线程数 |

| consumeThreadMax | 20 | 消费线程池最大线程数 |

| consumeConcurrentlyMaxSpan | 2000 | 单队列并行消费允许的最大跨度 |

| pullThresholdForQueue | 1000 | 拉消息本地队列缓存消息最大数 |

| pullInterval | 0 | 拉消息间隔,由于是长轮询,所以为0,但是如果应用为了流控,也可以设置大于0的值,单位毫秒 |

| consumeMessageBatchMaxSize | 1 | 批量消费,一次消费多少条消息 |

| pullBatchSize | 32 | 批量拉消息,一次最多拉多少条 |

4 PullConsumer配置

| 参数名 | 默认值 | 说明 |

| — | — | — |

| consumerGroup | DEFAULT_CONSUMER | Consumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组 |

| brokerSuspendMaxTimeMillis | 20000 | 长轮询,Consumer拉消息请求在Broker挂起最长时间,单位毫秒 |

| consumerTimeoutMillisWhenSuspend | 30000 | 长轮询,Consumer拉消息请求在Broker挂起超过指定时间,客户端认为超时,单位毫秒 |

| consumerPullTimeoutMillis | 10000 | 非长轮询,拉消息超时时间,单位毫秒 |

| messageModel | BROADCASTING | 消息支持两种模式:集群消费和广播消费 |

| messageQueueListener | | 监听队列变化 |

| offsetStore | | 消费进度存储 |

| registerTopics | | 注册的topic集合 |

| allocateMessageQueueStrategy | AllocateMessageQueueAveragely | Rebalance算法实现策略 |

5 Message数据结构

| 字段名 | 默认值 | 说明 |

| — | — | — |

| Topic | null | 必填,消息所属topic的名称 |

| Body | null | 必填,消息体 |

| Tags | null | 选填,消息标签,方便服务器过滤使用。目前只支持每个消息设置一个tag |

| Keys | null | 选填,代表这条消息的业务关键词,服务器会根据keys创建哈希索引,设置后,可以在Console系统根据Topic、Keys来查询消息,由于是哈希索引,请尽可能保证key唯一,例如订单号,商品Id等。 |

| Flag | 0 | 选填,完全由应用来设置,RocketMQ不做干预 |

| DelayTimeLevel | 0 | 选填,消息延时级别,0表示不延时,大于0会延时特定的时间才会被消费 |

| WaitStoreMsgOK | TRUE | 选填,表示消息是否在服务器落盘后才返回应答。 |

6 系统配置


本小节主要介绍系统(JVM/OS)相关的配置。

6.1 JVM选项

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

​ ​-server -Xms8g -Xmx8g -Xmn4g ​

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

​ -XX:+AlwaysPreTouch

禁用偏置锁定可能会减少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

6.2 Linux内核参数

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

image

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-9t3suYc0-1712188167158)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值