什么是MQ?
    消息队列中间件,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯
    MQ的应用场景?
    支付业务、
    常见的mq产品?
    RabbitMQ、ActiveMQ、RocketMQ、KafKa
    什么是AMQP协议模型?
    是用于在应用程序之间传递业务的开放标准
    rabbitmq支持哪些消息模式?
    简单队列模型
    任务工作模型
    发布/订阅 模式:
    广播模式
    路由模式
    主题模式

    如何使用RabbitMQ收发消息?(基于SpringAMQP)?
    1、双方引入SpringAMQP依赖

    1. <!--AMQP依赖,包含RabbitMQ-->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-amqp</artifactId>
    5. </dependency>

    2、创建队列
    3、创建消费者,监听队列
    4、创建发送者,
    如何项目中声明交换机、队列及绑定关系?
    第一种通过Bean对象:

     @Bean
        public Queue queue1(){
            return new Queue("fanout.queue1");
        }
        @Bean
        public Queue queue2(){
            return new Queue("fanout.queue2");
        }
        @Bean
        public Binding fanoutQueueBinding1(Queue queue1,FanoutExchange fanoutExchange){
            return  BindingBuilder.bind(queue1).to(fanoutExchange);
        }
    
        @Bean
        public Binding fanoutQueueBinding2(Queue queue2,FanoutExchange fanoutExchange){
            return  BindingBuilder.bind(queue2).to(fanoutExchange);
        }
    

    第二种通过注解:

     @RabbitListener(bindings = @QueueBinding(
                value = @Queue("fanout.queue1"),
                exchange = @Exchange(name = "itcast.fanout",type = ExchangeTypes.FANOUT)
        ))
        public void listenFanoutQueueMessage1(String msg){
            System.err.println("listenFanoutQueueMessage1 消费者接收到消息:【" + msg + "】");
        }
        @RabbitListener(bindings = @QueueBinding(
                value = @Queue("fanout.queue2"),
                exchange = @Exchange(name = "itcast.fanout",type = ExchangeTypes.FANOUT)
        ))
        public void listenFanoutQueueMessage2(String msg){
            System.err.println("listenFanoutQueueMessage2 消费者接收到消息:【" + msg + "】");
        }
     @RabbitListener(bindings = @QueueBinding(
                value = @Queue("queue1"),
                exchange = @Exchange(name = "Direct",type = ExchangeTypes.DIRECT),
                key = {"blue","red"}
        ))
        public void listenDirectQueueMessage1(String msg){
            System.err.println("listenDirectQueueMessage1 消费者接收到消息:【" + msg + "】");
        }
    
        @RabbitListener(bindings = @QueueBinding(
                value = @Queue("queue2"),
                exchange = @Exchange(name = "Direct",type = ExchangeTypes.DIRECT),
                key = {"yellow","red"}
        ))
        public void listenDirectQueueMessage2(String msg){
            System.err.println("listenDirectQueueMessage2 消费者接收到消息:【" + msg + "】");
        }
    
        @RabbitListener(bindings = @QueueBinding(
                value = @Queue("topic.queue1"),
                exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
                key = {"china.#"}
        ))
        public void listenTopicQueueMessage1(String msg){
            System.err.println("listenTopicQueueMessage1 消费者接收到消息:【" + msg + "】");
        }
    
        @RabbitListener(bindings = @QueueBinding(
                value = @Queue("topic.queue2"),
                exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
                key = {"#.news"}
        ))
        public void listenTopicQueueMessage2(String msg){
            System.err.println("listenTopicQueueMessage2 消费者接收到消息:【" + msg + "】");
        }
    
    <br />消息转换器的作用?<br />Spring会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。<br />只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:
    
    • 数据体积过大
    • 有安全漏洞
    • 可读性差

    如何修改MQ默认的消息转换器?
    1、引入依赖

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.9.10</version>
    </dependency>
    

    2、分别在生产者和消费者中的配置类里声明@Bean对象

    消费者:
    @SpringBootApplication
    public class ConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
        @Bean
        public MessageConverter messageConverter(){
            return new Jackson2JsonMessageConverter();
        }
    }
    生产者:
    @SpringBootApplication
    public class PublisherApplication {
        public static void main(String[] args) {
            SpringApplication.run(PublisherApplication.class);
        }
        @Bean
        public MessageConverter messageConverter(){
            return new Jackson2JsonMessageConverter();
        }
    }
    

    https://www.processon.com/view/link/62a735040e3e747c5c3ffeb9

    MQ高级:
    rabbitmq如何保证消息的可靠性?

    rabbitmq如何解决百万消息堆积问题?

    rabbitmq如何防止消息重复消费?

    rabbitmq如何保证高可用?

    rabbitmq消息的重试机制?

    rabbitmq如何实现延迟消费?

    rabbitmq在项目中的使用场景?