面试官心理剖析
面试官在询问如何防止MQ消息被重复消费时,其实是在考察候选人对消息队列、分布式系统设计以及容错机制的理解,通过这些问题,面试官可以全面了解候选人在处理MQ消息重复消费问题时的思考方式、技术能力和实践经验,从而评估其是否适合担任相关岗位。
MQ实现策略
MQ提供了以下几种方式来防止消息被重复消费:
-
消费者手动确认消息
在消费者消费消息后,通过调用basic.ack()方法手动确认消息已被消费。这样一来,RabbitMQ就会从队列中删除该消息,防止消息被重复消费。
// 创建连接和频道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 设置消息确认模式为手动确认
channel.basicQos(1);
// 定义消息消费者
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
try {
// 模拟消费消息
String message = new String(body, "UTF-8");
System.out.println("Received message: " + message);
// 手动确认消息消费
channel.basicAck(envelope.getDeliveryTag(), false);
} catch (Exception e) {
// 消息消费失败,进行异常处理
channel.basicNack(envelope.getDeliveryTag(), false, true);
}
}
};
// 开始消费消息
channel.basicConsume(queueName, false, consumer);
-
消息去重使用乐观锁
评论