1.什么是MQ?
    MQ MessageQueue 消息队列 用来存放消息
    也就是事件驱动架构中的Broker
    用来实现异步通讯

    2.MQ的应用场景?
    ①需要异步通通讯
    ②解除不同业务间的耦合
    ③提升并发量 吞吐量
    ④故障隔离
    ⑤流量削峰

    3.常见的mq产品?

    RabbitMQ ActiveMQ RocketMQ Kafka
    公司/社区 Rabbit Apache 阿里 Apache
    开发语言 Erlang Java Java Scala&Java
    协议支持 AMQP,XMPP,SMTP,STOMP OpenWire,STOMP,REST,XMPP,AMQP 自定义协议 自定义协议
    可用性 一般
    单机吞吐量 一般 非常高
    消息延迟 微秒级 毫秒级 毫秒级 毫秒以内
    消息可靠性 一般 一般

    追求可用性:Kafka、 RocketMQ 、RabbitMQ
    追求可靠性:RabbitMQ、RocketMQ
    追求吞吐能力:RocketMQ、Kafka
    追求消息低延迟:RabbitMQ、Kafka

    4.什么是AMQP协议模型?
    Advanced Message Queueing Protocol
    是用于在应用程序之间传递消息的开放标准
    该协议与语言与平台无关 更符合做服务中独立性的要求。

    5.rabbitmq支持哪些消息模式?
    五种

    发布:
    ①Basic Queue 简单队列模型

    ②Work Queue 也被称为Task queue 任务模型
    让多个消费者绑定到一个队列 共同消费队列中的信息

    订阅:
    ③Fanout 广播 交换机将生产者发送的消息发送到绑定的所有队列
    ④Direct 定向 交换机将消息发送给含有指定的RoutingKey的队列上
    ⑤Topic 通配符 可使用# *号 RoutingKey一般由一个或多个单词组成
    例如 item.insert

    5.如何使用RabbitMQ收发消息?(基于SpringAMQP)?
    ①添加依赖

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

    ②发送和接收端 添加配置

    spring:
      rabbitmq:
        host: 192.168.150.101 # 主机名
        port: 5672 # 端口
        virtual-host: / # 虚拟主机
        username: itcast # 用户名
        password: 123321 # 密码
    

    发送端:

    @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void testSimpleQueue() {
            // 队列名称
            String queueName = "simple.queue";
            // 消息
            String message = "hello, spring amqp!";
            // 发送消息
            rabbitTemplate.convertAndSend(queueName, message);
        }
    

    接收端:

    @Component
    public class SpringRabbitListener {
    
        @RabbitListener(queues = "simple.queue")
        public void listenSimpleQueueMessage(String msg) throws InterruptedException {
            System.out.println("spring 消费者接收到消息:【" + msg + "】");
        }
    

    6.如何项目中声明交换机、队列及绑定关系?
    方法一:在配置类中利用@Bean的方式

    //声明交换机
        @Bean
        public FanoutExchange fanoutExchange(){
            return new FanoutExchange("itcast.fanout");
        }
    
        //声明第1个队列
        @Bean
        public Queue fanoutQueue1(){
            return new Queue("fanout.queue1");
        }
    
        //将第1个队列与交换机绑定
        @Bean
        public Binding bindingQueue1(Queue fanoutQueue1,FanoutExchange fanoutExchange){
            return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
        }
    

    方法二:直接在@RabbitListener注解中声明绑定关系

    @RabbitListener(bindings = @QueueBinding(
                value = @Queue(name = "direct.queue2"),
                exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT),
                key = {"yellow","red"}
        ))
        public void listenDirectQueue2(String msg){
            System.out.println("消费者接收到direct.queue2的消息:["+ msg +"]");
        }
    

    7.消息转换器的作用?
    可以将发送的消息序列化为指定格式 发送给MQ

    8.如何修改MQ默认的消息转换器?
    添加依赖
    在启动类中添加一个Bean

    @Bean
    public MessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }
    

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

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

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

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

    rabbitmq如何保证高可用?

    rabbitmq消息的重试机制?

    rabbitmq如何实现延迟消费?

    rabbitmq在项目中的使用场景?