一、消費端限流原理圖
二、消費端限流實現步驟
1、確保Ack機制爲手動確認機制
2、配置屬性perfetch:設置每次拉取消息的數量
- 以上兩個配置只需要在application.yml配置即可
# 配置RabbitMQ基本信息
spring:
rabbitmq:
host: 192.168.33.100
username: guest
password: guest
virtual-host: /
port: 5672
listener:
simple:
acknowledge-mode: manual # 設置消費端手動 ack
prefetch: 2 # 限流,設置消費端併發處理消息的數量,必須設置acknowledge-mode: manual 纔有效
3、監聽消息方法方法
- 處理完消息之後必須手動簽收
@Component
public class RabbitMQConfig {
/**
* Consumer 消息限流
* 限流機制:
* 1. 確保ack機制爲手動確認
* 2. 在application.yml設置prefetch屬性:設置消費端併發處理消息的數量
* 比如:prefetch = 1 表示消費端每次從mq拉取一條消息,直到手動確認消費完畢之後,纔會繼續拉取下一條消息
*/
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange(value = "xkp_topic_exchange",type = "topic"),
value = @Queue(value = "xkp_queue",durable = "true"),
key = "xkp.#"
))
public void handlerMessage(Message message, Channel channel)throws Exception {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
Thread.sleep(1000);
// 1. 轉換消息
System.out.println("消息內容: " + new String(message.getBody()));
// 處理消息
// .............
// 2. 手工簽收
channel.basicAck(deliveryTag,true);
}
}