天天看点

rabbitmq 不同的消费者消费同一个队列_RabbitMQ如何保证队列里的消息99.99%被消费?...1. 本篇概要2. 开启显式Ack模式

rabbitmq 不同的消费者消费同一个队列_RabbitMQ如何保证队列里的消息99.99%被消费?...1. 本篇概要2. 开启显式Ack模式

1. 本篇概要

其实,还有1种场景需要考虑:当消费者接收到消息后,还没处理完业务逻辑,消费者挂掉了,那消息也算丢失了?,比如用户下单,订单中心发送了1个消息到RabbitMQ里的队列,积分中心收到这个消息,准备给这个下单的用户增加20积分,但积分还没增加成功呢,积分中心自己挂掉了,导致数据出现问题。

那么如何解决这种问题呢?

为了保证消息被消费者成功的消费,RabbitMQ提供了消息确认机制(message acknowledgement),本文主要讲解RabbitMQ中,如何使用消息确认机制来保证消息被消费者成功的消费,避免因为消费者突然宕机而引起的消息丢失。

rabbitmq 不同的消费者消费同一个队列_RabbitMQ如何保证队列里的消息99.99%被消费?...1. 本篇概要2. 开启显式Ack模式

2. 开启显式Ack模式

我们开启一个消费者的代码是这样的:

// 创建队列消费者com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println("Received Message '" + message + "'"); }};channel.basicConsume(QUEUE_NAME, true, consumer);
           

这里的重点是channel.basicConsume(QUEUE_NAME, true, consumer);方法的第2个参数,让我们先看下basicConsume()的源码:

public String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException { return this.basicConsume(queue, autoAck,