消息中间件Rabbitmq(三):消费端限流、TTL队列以及死信队列

代码见:
链接:https://pan.baidu.com/s/11vmH2SK-aN2yvokt0juAQA
提取码:ormm

一:消费掉限流

场景:一些特殊时候在mq队列中累计大量的消息待处理,这时候启动客户端会导致客户端瞬间处理大量数据这时候有可能导致服务宕机。这里我们设置单次处理个数,直接在YML里配置即可:

#消费者最小数量
spring.rabbitmq.listener.simple.concurrency=1
#消费之最大数量
spring.rabbitmq.listener.simple.max-concurrency=10

#在单个请求中处理的消息个数,他应该大于等于事务数量(unack的最大数量)
spring.rabbitmq.listener.simple.prefetch=2

二:TTL队列

TTL队列又叫死信队列,通常用延迟队列,常见的场景就是例如购物平台的订单30分钟内支付等。死信队列中同一种过时时长必须一致。
在这里插入图片描述

1.配置

package com.rabbitmq.config;

import java.util.HashMap;
import java.util.Map;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 死信队列
 * @author monxz
 *
 */
@Configuration
public class RabbiteForDelayConfig {
	
    /**
     * 死信交换机
     * @return
     */
    @Bean
    public DirectExchange delayExchange(){
        return new DirectExchange("delay_exchange");
    }
    
    /**
     * 死信队列
     * @return
     */
    @Bean
    public Queue delayQueue(){
        Map<String,Object> map = new HashMap<>(16);
        map.put("x-dead-letter-exchange","receive_exchange");
        map.put("x-dead-letter-routing-key", "receive_key");
        return new Queue("delay_queue",true,false,false,map);
    }

    /**
     * 给死信队列绑定交换机
     * @return
     */
    @Bean
    public Binding delayBinding(){
        return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay_key");
    }


    
    /**
     * 死信接收交换机
     * @return
     */
    @Bean
    public DirectExchange receiveExchange(){
        return new DirectExchange("receive_exchange");
    }

    /**
     * 死信接收队列
     * @return
     */
    @Bean
    public Queue receiveQueue(){
        return new Queue("receive_queue");
    }

    /**
     * 死信交换机绑定消费队列
     * @return
     */
    @Bean
    public Binding receiveBinding(){
        return BindingBuilder.bind(receiveQueue()).to(receiveExchange()).with("receive_key");
    }


}

2.消费者

package com.rabbitmq.customer;


import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.rabbitmq.constant.MqConstant;

/**
 * Topic模式消费者
 * @author monxz
 *
 */
@Component
public class DelayCustmer {
	
	@RabbitListener(queues = "receive_queue")
    public void receiveMsg1(String msg) {
        System.out.println("队列1接收到消息:" + msg);
    }



}

3.生产者

@GetMapping("/delay")
	private Object  testDelay() {
		 rabbitTemplate.convertAndSend(
                 "delay_exchange",
                 "delay_key",
                 "延迟消息",
                 message -> {
                 	 //注意这里时间要是字符串形式
                     message.getMessageProperties().setExpiration("6000");
                     return message;
                 }
         );

		return true;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值