前面说到,MQ
可以起到一个削峰的作用,那MQ
是怎么进行削峰的呢?
其实,就是基于消费端限流
来实现的。假如,到达后端的请求数据量很大,处理不过来,并且在处理的过程中可能会发生问题,就需要一个消费端限流机制
来保证业务被正常处理。
消费端限流机制的内在原理:每次处理一定量
的消息,只有这些消息被正确处理了,才会继续从消息队列中拿取消息并进行处理。
实现消费端限流机制的步骤:
配置prefix的数量:比如,比如prefetch="1"
,就说明,消费者每次读取一条
消息,只有当这条消息被正确处理之后,才会继续从消息队列中提取消息。
采用手动确认机制,配置acknowledge="manual"
package com.thorns.listener;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* 限流机制:
* 确保ack机制为手动确认
* 配置属性
*
*/
@Component
public class QosListener implements ChannelAwareMessageListener {
@Override
public void onMessage(Message message, Channel channel) throws Exception {
// 获取消息
System.out.println(new String(message.getBody()));
// 处理业务逻辑
System.out.println("处理业务逻辑");
// 签收
channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
}
}