1、 消费端限流
Consumer限流机制:
1,确保ack机制为手动确认。
2,配置prefeteh参数,每次拉取多少消息,根据自己系统能承受的最大值来定。
读取消息—>手动确认消息—>才能再拉取消息
2、超时配置 TTL
TTL全程 time to live
当消息到达存活时间后,还没有被消费,则会自动清除。
RabbitMQ可以对消息设置过期时间,也可以对整个队列设置过期时间,如果两个都设置的话以较短的为准。
对整个队列设置
@Bean("bootQueue") public Queue bootQueue(){
// .tll(2000)队列中过期时间为2s return QueueBuilder.durable(QUEUE_NAME).ttl(2000).build(); }
发消息时设置,通过MessagePostProcessor进行后置处理
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException {
//消息过期时间为五秒 message.getMessageProperties().setExpiration("5000"); return message; } };
//传入messagePostProcessor参数
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"confirm","test confirm",messagePostProcessor);
3、死信队列
英文缩写DLX, dead letter Exchange,死信交换机,当消息成为Dead Message后,可以被重新发送到另一个交换机中,这个交换机就是DLX。
消息成为死信的三种情况:
1、消息队列到达长度限制
2、消费者拒绝接收消息,basicNack或者basicReject,并且不把消息重新放到交换机中,requeue=false
3、原队列存在消息过期设置,消息达到超时时间未被消费
队列绑定私信交换机:
给队列设置参数 x-dead-letter-exchange 和 x-dead-letter-routing-key
4、延迟队列
延迟队列,即消息进入队列后并不会马上投递给消费者,只有到达指定时间后才会被消费。
需求:1,下单后三十分钟未支付,取消订单,回滚库存。
2,新用户注册七天后,发送短信问候。
实现方式:1,使用定时器扫表,问题:不优雅,有误差
2,延迟队列
RabbitMQ并没有提供延迟队列的功能,但是可以用TTL+私信队列来实现。
5、消息补偿
如果有更高要求的消息可靠性保障,可以用消息补偿机制,简单地说就是把消息写到数据库里。
这个图看起来好像很复杂,其实只做到了三件事情:
发消息
收到消息确认
检查比对是不是收到消息了
详细说明消息补偿流程
可以参考下面链接 P34
14_应用问题-幂等性保障_哔哩哔哩_bilibili