消息丢失(可靠性)

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%消费组名,可以再创建订阅死信队列的消费者

要注意顺序模式下消费者会无限制重试,消费失败不会进入死信队列而是原始队列

posted @ 2025-07-05 09:52  CyrusHuang  阅读(7)  评论(0)    收藏  举报