消费端限流
在并发量高的情况下,如秒杀、抢票等场景,如果不对 RabbitMQ 推送信息给消费者的速度进行限流的话,很容易打崩系统
RabbitMQ 的限流机制:
- 必要条件:消费端 ack 机制为手动签到
- 如果限流数为1,表示消费端每次只能从mq拉去一条消息来消费,直到手动确认消费完毕后,才会继续拉去下一条信息。使用这种机制来对消费端进行限流
具体配置:
spring:
rabbitmq:
# 配置消费端
listener:
simple:
acknowledge-mode: manual
# 消费端限流数,表示每次只能拉取1000条信息
prefetch: 1000
消息存活时间TTL
RabbitMQ允许您为某个消息和队列中的所有消息设置TTL(生存时间)。如果两者都设置了,则以时间短的为准。
过期的消息不会立刻从队列中被清除,而是等到它轮询到队头的时候判断它是否过期,过期再清除。有点类似于Redis的惰性清理。
为队列设置过期时间
参数是:x-message-ttl
@Configuration
public class RabbitMQConfig {
private static final String SB_TOPIC_QUEUE="sb_topic_queue1";
// 声明队列
@Bean
public Queue queue1(){
Queue build = QueueBuilder.durable(SB_TOPIC_QUEUE).build();
build.addArgument("x-message-ttl",3000);
return build;
}
}
为单个消息设置过期时间
@Test
public void testTTLOneMessage(){
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration(String.valueOf(8000));
return message;
}
};
for (int i = 0; i < 10; i++) {
template.convertAndSend("sb_topic_exchange","user2.info",(Object) "这个消息的ttl为8s",messagePostProcessor);
}
}