天天看點

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,