消息丢失(可靠性)
RocketMQ 通过 多层级防护机制 防止消息丢失和保证可靠性,需从 生产者、Broker、消费者 三个环节综合配置
Producer 端防护
同步发送 + 同步刷盘/复制
// 同步发送(必须捕获异常)
try {
SendResult result = producer.send(msg);
if (result.getSendStatus() != SendStatus.SEND_OK) {
// 重试或记录日志
}
} catch (Exception e) {
// 重试逻辑(建议最多3次)
}
// Broker.conf 配置文件
flushDiskType = SYNC_FLUSH // 同步刷盘
brokerRole = SYNC_MASTER // 同步复制
重试机制
// 内置重试(默认2次)
producer.setRetryTimesWhenSendFailed(3);
// 网络异常时自动重试另一台Broker
producer.setRetryAnotherBrokerWhenNotStoreOK(true);
Broker 端防护
消息持久化配置
# broker.conf
flushDiskType = SYNC_FLUSH # 同步刷盘(每条消息落盘才返回ACK)
brokerRole = SYNC_MASTER # 同步复制(主从都写入成功才返回ACK)
transientStorePoolEnable = true # 启用堆外内存缓冲(同步刷盘性能优化)
刷盘和同步的维度
| 控制维度 | 选项 | 说明 |
|---|---|---|
| 刷盘策略 | SYNC_FLUSH(同步刷盘) |
消息写入内存后,必须刷到磁盘才返回响应。 |
ASYNC_FLUSH(异步刷盘) |
消息写入内存后立即返回响应,由后台线程异步刷盘。 | |
| 主从同步 | SYNC_MASTER(同步复制) |
消息必须同步到从节点后才返回响应。 |
ASYNC_MASTER(异步复制) |
消息发送到主节点后立即返回响应,从节点异步同步。 |
刷盘和同步的场景建议
| 组合 | 可靠性 | 吞吐量 | 延迟 | 适用场景 |
|---|---|---|---|---|
| SYNC_FLUSH + SYNC_MASTER | ★★★★★ | ★★☆ | 高 | 金融交易 |
| SYNC_FLUSH + ASYNC_MASTER | ★★★★☆ | ★★★☆ | 中 | 电商订单 |
| ASYNC_FLUSH + SYNC_MASTER | ★★★☆☆ | ★★★★ | 中低 | 社交消息 |
| ASYNC_FLUSH + ASYNC_MASTER | ★★☆☆☆ | ★★★★★ | 低 | 监控日志 |
主从高可用
多副本部署,一个 Broker 至少一个从节点,配置如下
brokerId = 0 # 0表示Master,>0表示Slave
brokerName = broker-a # 与主从节点名称相同
Consumer 端防护
手动 ACK
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
try {
// 业务处理
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; // 确认消费成功
} catch (Exception e) {
return ConsumeConcurrentlyStatus.RECONSUME_LATER; // 触发重试
}
});
重试机制
并发模式下默认重试16次,超过后进入死信队列,topic 为 %DLQ%消费组名,可以再创建订阅死信队列的消费者
要注意顺序模式下消费者会无限制重试,消费失败不会进入死信队列而是原始队列

浙公网安备 33010602011771号