文章目录
为什么要做消费端限流?
A系统每秒最大能处理1000请求,若这时开展了秒杀活动,请求瞬间增多,全部打到A系统上的话那A系统肯定会崩溃宕机什么的,这对业务正常运转造成了巨大的影响。所以我们把消息存入MQ中,然后每次从MQ中拉取1000个请求,保证A系统能正常运转,业务正常进行。
当有一天,A系统要维护了,维护期间会有大量消息堆积在MQ中,维护好了若让MQ中的消息全打入A系统的话,怕不是马上就挂。
所以我们需要在消费端限流,来保证系统的稳定性和业务的正常运转。
消费端限流的测试
配置文件中:
配置prefetch属性设置消费端一次拉取多少消息
消费端的确认模式一定为手动确认。acknowledge=“manual”
消费者:
/**
* RabbitMQ消费端限流
* 1.设置签收消息的方式为手动
* 2.在listener-container中设置 每次拉取的消息数
* prefetch="1" 表示每次从mq拉取1条消息,直到手动确认消费完后,才继续下次的消息拉取
* 3.
*/
@Component
public class QosListener implements ChannelAwareMessageListener {
public void onMessage(Message message, Channel channel) throws Exception {
Thread.sleep(1000);
long deliveryTag = message.getMessageProperties().getDeliveryTag();
//1.获取消息
System.out.println(new String(message.getBody()));
//2.处理业务
//3.签收消息
channel.basicAck(deliveryTag,true);
}
public void onMessage(Message message) {
}
}
每次从mq拉取固定条数消息,直到手动确认消费完后,才会继续下次的消息拉取。