1. 消息队列可靠性问题现状
消息队列作为分布式系统解耦的利器,在现代架构中扮演着重要角色。但从业十年间,我见过太多团队在消息可靠性上栽跟头——电商订单莫名消失、物流状态更新延迟、支付回调石沉大海。这些事故轻则导致数据不一致,重则引发资金损失。
消息丢失通常发生在五个关键环节:生产者发送时网络抖动、Broker持久化失败、消费者处理崩溃、消息积压过期,以及运维误操作。上周刚帮一个金融团队排查过类似问题:他们的对账系统每天约有0.1%的交易记录对不上,最终发现是消费者线程池爆满导致消息被重复丢弃。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 生产者端保障方案
2.1 事务消息机制
以RocketMQ为例,其事务消息实现堪称经典。核心原理是两阶段提交:
- 先发送
半消息到Broker(此时消费者不可见) - 执行本地事务并提交状态
- Broker根据回调结果决定提交或回滚
java复制// RocketMQ事务消息示例
TransactionMQProducer producer = new TransactionMQProducer("group");
producer.setTransactionListener(new TransactionListener() {
@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
// 执行本地数据库操作
return someService.saveOrder(arg) ?
LocalTransactionState.COMMIT_MESSAGE :
LocalTransactionState.ROLLBACK_MESSAGE;
}
});
关键点:事务监听器必须实现幂等性,网络超时时要做好状态查询补偿
2.2 确认机制+本地消息表
对于Kafka这类不支持事务的消息队列,可以采用:
- 业务数据与消息状态同库事务
- 异步任务扫描待发送消息
- 消息ID作为去重键
sql复制CREATE TABLE local_message (
id
