RocketMQ性能调优与最佳实践
性能调优策略
1. JVM参数调优
NameServer JVM调优
# runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m"
JAVA_OPT="${JAVA_OPT} -XX:MaxGCPauseMillis=20 -XX:G1ReservePercent=20"
Broker JVM调优
# runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m"
JAVA_OPT="${JAVA_OPT} -XX:MaxGCPauseMillis=20 -XX:G1ReservePercent=20"
JAVA_OPT="${JAVA_OPT} -XX:G1MixedGCCountTarget=64"
JAVA_OPT="${JAVA_OPT} -XX:+PrintGCApplicationStoppedTime"
2. 系统参数调优
Linux内核参数优化
# /etc/sysctl.conf
fs.file-max=6553500
fs.nr_open=6553500
net.ipv4.tcp_max_tw_buckets=2000000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=10
net.core.somaxconn=65535
net.core.netdev_max_backlog=5000
net.ipv4.tcp_max_syn_backlog=65535
文件描述符限制
# /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350
3. Broker配置调优
存储配置优化
# broker.conf
# 消息存储路径
storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
# commitLog文件大小,默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue文件大小,默认600万个条目
mapedFileSizeConsumeQueue=6000000
# 刷盘方式:ASYNC_FLUSH(异步刷盘)或 SYNC_FLUSH(同步刷盘)
flushDiskType=ASYNC_FLUSH
# 刷盘间隔时间(毫秒)
flushIntervalCommitLog=1000
# 磁盘空间使用率阈值
diskMaxUsedSpaceRatio=75
# 文件保留时间(小时)
fileReservedTime=72
网络配置优化
# broker.conf
# Broker监听端口
listenPort=10911
# 发送消息线程池数量
sendMessageThreadPoolNums=16
# 拉取消息线程池数量
pullMessageThreadPoolNums=16
# 查询消息线程池数量
queryMessageThreadPoolNums=8
# 网络传输最大包大小
maxMessageSize=4194304
最佳实践
1. Topic和Tag设计
Topic设计原则
// 好的设计
// 按业务模块划分Topic
Topic: OrderService
Topic: UserService
Topic: PaymentService
// 不好的设计
// 所有消息都使用一个Topic
Topic: AllMessages
Tag使用规范
// 合理使用Tag进行消息分类
Message msg1 = new Message("OrderTopic", "CREATE", "订单创建消息".getBytes());
Message msg2 = new Message("OrderTopic", "UPDATE", "订单更新消息".getBytes());
Message msg3 = new Message("OrderTopic", "CANCEL", "订单取消消息".getBytes());
// 消费者订阅特定Tag
consumer.subscribe("OrderTopic", "CREATE || UPDATE");
2. 消息生产和消费优化
生产者优化
public class OptimizedProducer {
private DefaultMQProducer producer;
public OptimizedProducer() {
producer = new DefaultMQProducer("optimized_producer_group");
producer.setNamesrvAddr("localhost:9876");
// 设置发送超时时间
producer.setSendMsgTimeout(3000);
// 设置压缩阈值
producer.setCompressMsgBodyOverHowmuch(4096);
// 设置重试次数
producer.setRetryTimesWhenSendFailed(2);
producer.setRetryTimesWhenSendAsyncFailed(2);
// 设置最大消息大小
producer.setMaxMessageSize(4194304);
}
public void sendBatchMessages(List<Message> messages) {
try {
// 批量发送消息
producer.send(messages);
} catch (Exception e) {
e.printStackTrace();
}
}
}
消费者优化
public class OptimizedConsumer {
private DefaultMQPushConsumer consumer;
public OptimizedConsumer() {
consumer = new DefaultMQPushConsumer("optimized_consumer_group");
consumer.setNamesrvAddr("localhost:9876");
// 设置最小和最大消费线程数
consumer.setConsumeThreadMin(20);
consumer.setConsumeThreadMax(64);
// 设置单次消费消息数量
consumer.setConsumeMessageBatchMaxSize(32);
// 设置拉取消息超时时间
consumer.setConsumerPullTimeoutMillis(1000 * 10);
// 设置消费失败重试次数
consumer.setMaxReconsumeTimes(16);
// 设置消费位点
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
}
}
3. 集群部署优化
多Master模式
# broker-a.conf
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
namesrvAddr=192.168.1.10:9876;192.168.1.11:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10911
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/usr/local/rocketmq/store
storePathCommitLog=/usr/local/rocketmq/store/commitlog
flushDiskType=ASYNC_FLUSH
# broker-b.conf
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
namesrvAddr=192.168.1.10:9876;192.168.1.11:9876
# 其他配置与broker-a.conf相同
多Master多Slave模式
# broker-a-master.conf
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0 # 0表示Master
namesrvAddr=192.168.1.10:9876;192.168.1.11:9876
# 其他配置...
# broker-a-slave.conf
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1 # 1表示Slave
namesrvAddr=192.168.1.10:9876;192.168.1.11:9876
# 其他配置...
4. 监控和告警
监控指标
// 自定义监控指标收集
public class RocketMQMonitor {
public void collectMetrics() {
// 收集生产者指标
// - 发送TPS
// - 发送延迟
// - 发送失败率
// 收集消费者指标
// - 消费TPS
// - 消费延迟
// - 积压消息数
// 收集Broker指标
// - 磁盘使用率
// - 内存使用率
// - JVM GC情况
}
}
告警策略
# 告警阈值配置
# 积压消息数 > 100000
# 消费延迟 > 60秒
# Broker磁盘使用率 > 85%
# 生产者发送失败率 > 1%
故障排查
1. 常见问题诊断
消息积压问题
# 查看Topic统计信息
sh bin/mqadmin statsAll -n localhost:9876
# 查看消费者状态
sh bin/mqadmin consumerProgress -n localhost:9876 -g consumer_group_name
# 查看Topic路由信息
sh bin/mqadmin topicRoute -n localhost:9876 -t TopicName
消费失败问题
# 查看死信队列
sh bin/mqadmin queryMsgByUniqueKey -n localhost:9876 -t %DLQ%consumer_group_name -i message_key
# 查看重试队列
sh bin/mqadmin queryMsgByUniqueKey -n localhost:9876 -t %RETRY%consumer_group_name -i message_key
2. 日志分析
NameServer日志
# 查看NameServer日志
tail -f ~/logs/rocketmqlogs/namesrv.log
Broker日志
# 查看Broker日志
tail -f ~/logs/rocketmqlogs/broker.log
# 查看存储日志
tail -f ~/logs/rocketmqlogs/store.log
安全配置
1. ACL权限控制
启用ACL
# broker.conf
aclEnable=true
ACL配置文件
# conf/plain_acl.yml
globalWhiteRemoteAddresses:
- 192.168.1.*
accounts:
- accessKey: rocketmq
secretKey: 12345678
whiteRemoteAddress:
admin: false
defaultTopicPerm: DENY
defaultGroupPerm: SUB
topicPerms:
- topicA=PUB|SUB
- topicB=PUB
groupPerms:
- groupA=SUB
- groupB=SUB
2. TLS加密传输
Broker配置
# broker.conf
tlsServerNeedClientAuth=require
tlsServerKeyPath=/path/to/server.key
tlsServerCertPath=/path/to/server.crt
tlsServerKeyPassword=123456
小结
本章介绍了RocketMQ的性能调优策略和最佳实践,包括JVM参数调优、系统参数优化、Broker配置优化、Topic和Tag设计规范、集群部署优化、监控告警策略以及故障排查方法。
通过合理配置和优化,可以充分发挥RocketMQ的性能优势,确保系统稳定运行。在下一章节中,我们将学习如何使用RocketMQ Dashboard进行可视化监控和管理。
1503

被折叠的 条评论
为什么被折叠?



