面试官心理剖析

面试官在询问如何防止MQ消息被重复消费时,其实是在考察候选人对消息队列、分布式系统设计以及容错机制的理解,通过这些问题,面试官可以全面了解候选人在处理MQ消息重复消费问题时的思考方式、技术能力和实践经验,从而评估其是否适合担任相关岗位。

MQ实现策略

MQ提供了以下几种方式来防止消息被重复消费:

  1. 消费者手动确认消息

在消费者消费消息后,通过调用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);
  1. 消息去重使用乐观锁