数据的丢失问题可能出现在生产者、MQ服务器、消费者中,以RabbitMQ和Kafka为例来分析一下。
RabbitMQ
生产者弄丢了数据
生产者将数据发送到RabbitMQ的时候,可能数据就在半路给搞丢了,因为网络问题等都有可能。可以用RabbitMQ提供的事务功能,生产者发送数据之前开启RabbitMQ事务channel.txSelect() ,然后发送消息,如果消息没有成功被RabbitMQ接收到,生产者会收到异常报错,此时就可以回滚事务channel.txRollback() ,然后重试发送消息。如果收到了消息,那么可以提交事务channel.txCommit() 。
try {
// 通过工厂创建连接
connection = factory.newConnection();
// 获取通道
channel = connection.createChannel();
// 开启事务
channel.txSelect();
// 这里发送消息
channel.basicPublish(exchange, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
// 模拟出现异常
int result = 1 / 0;
// 提交事务
channel.txCommit();
本文分析了MQ消息队列(以RabbitMQ和Kafka为例)中可能出现的数据丢失问题,包括生产者、MQ服务器和消费者三个层面,并提出了相应的解决策略。对于RabbitMQ,可以通过启用事务、模式或两者结合确保消息不丢失;而对于Kafka,关闭自动提交offset并确保副本同步是防止数据丢失的关键。
订阅专栏 解锁全文
1272

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



