RabbitMQ初级的部分面试题

这篇具有很好参考价值的文章主要介绍了RabbitMQ初级的部分面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.RabbitMQ是什么?有什么作用?

        RabbitMQ是一个消息代理:它接受和转发消息。能够实现异步消息处理,达到业务解耦,错峰流控的功能。它的实现是基于消息队列(Queue)。

2.什么是消息队列,有什么作用?

        消息队列(Message Queue MQ)是实现应用之间数据通信的一种机制,采用先进先出的数据结构和生产者消费者设计模式实现通信。

RabbitMQ初级的部分面试题,rabbitmq,分布式

消息队列的优势:解耦,异步,消峰。

2.1 解耦:

        实现生产者和消费者的解耦,生产者和消费者不直接调用,也不用关心对方如何处理,代码的维护性提高

        例如:使用openfeign实现服务调用,如果被调用服务的接口发生修改,服务调用方也需要进行修改,服务之间的耦合性较高,不利于开发和维护

RabbitMQ初级的部分面试题,rabbitmq,分布式

2.2 异步:

同步调用,服务A调用服务B,必须等待服务B执行完业务,服务A才能执行其它业务

异步调用,服务A发送消息给消息队列,马上返回完成其它业务,不用等待服务B执行完

 

RabbitMQ初级的部分面试题,rabbitmq,分布式

2.3削峰:

可以通过控制消息队列的长度来限制请求流量,从而达到限流保护服务器的作用

消息队列的缺点:

  1. 提高系统的复杂性

  2. 降低系统的可用性

3.消息队列的基本概念

  • 生产者

    向消息队列发送消息的服务

  • 消费者

    从消息队列取消息的服务

  • 队列 queue

    存放消息的容器,采用FIFO数据结构

  • 交换机 exchange

    实现消息路由,将消息分发到对应的队列中

  • 消息服务器 Broker

    进行消息通信的软件平台服务器

  • 虚拟主机 virtual host

    类似于namespace,将不同用户的交换机和队列区分开来

  • 连接 connection

    网络连接

  • 通道 channel

    数据通信的通道

RabbitMQ初级的部分面试题,rabbitmq,分布式

4.RabbitMQ常见的五种消息模型

  1. 简单的一对一模型

  2. 工作队列模型 ,一个生产者将消息轮询分发给多个消费者

  3. 发布/订阅模型 ,生产者发布消息,多个消费者同时收取

  4. 路由模型 ,生产者通过关键字发送消息给特定消费者

  5. 主题模型 ,路由模式基础上,在关键字里加入了通配符

4.1 一对一模型:

RabbitMQ初级的部分面试题,rabbitmq,分布式

最基本的队列模型: 一个生产者发送消息到一个队列,一个消费者从队列中取消息。

4.2 工作队列模型

RabbitMQ初级的部分面试题,rabbitmq,分布式

工作队列,生产者将消息分发给多个消费者,如果生产者生产了100条消息,消费者1消费50条,消费者2消费50条。

4.3 发布/订阅模型

RabbitMQ初级的部分面试题,rabbitmq,分布式

发布/订阅模式和Work模式的区别是:Work模式只存在一个队列,多个消费者共同消费一个队列中的消息;而发布订阅模式存在多个队列,不同的消费者可以从各自的队列中处理完全相同的消息。

4.4 路由模型

RabbitMQ初级的部分面试题,rabbitmq,分布式

路由模式的消息队列可以给队列绑定不同的key,生产者发送消息时,给消息设置不同的key,这样交换机在分发消息时,可以让消息路由到key匹配的队列中。 可以想象上图是一个日志处理系统,C1可以处理error日志消息,C2可以处理info\error\warining类型的日志消息,使用路由模式就很容易实现了。

4.5 主题模型

RabbitMQ初级的部分面试题,rabbitmq,分布式

主题模式和路由模式差不多,在key中可以加入通配符:

  • * 匹配任意一个单词 com.* ----> com.hopu com.blb com.baidu

  • # 匹配.号隔开的0个或多个单词 com.# ---> com.hopu.net com.hopu com.163.xxx.xxx.xxx

5.SpringBoot整合RabbitMQ

1)创建两个SpringBoot项目,一个作为生产者,一个作为消费者

生产者会发送两种消息:保存课程(更新和添加),删除课程

消费者监听两个队列:保存课程队列和删除课程队列

2)给生产者和消费者服务添加依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
 </dependency>

3) 给生产者和消费者服务添加配置

spring:
    rabbitmq:
      host: localhost
      port: 5672
      username: admin
      password: 123456
      virtual-host: myhost

4)生产者的配置,用于生成消息队列和交换机

/**
 * RabbitMQ的配置
 */
@Configuration
public class RabbitMQConfig {
​
    public static final String QUEUE_COURSE_SAVE = "queue.course.save";
    public static final String QUEUE_COURSE_REMOVE = "queue.course.remove";
    public static final String KEY_COURSE_SAVE = "key.course.save";
    public static final String KEY_COURSE_REMOVE = "key.course.remove";
    public static final String COURSE_EXCHANGE = "edu.course.exchange";
​
    @Bean
    public Queue queueCourseSave() {
        return new Queue(QUEUE_COURSE_SAVE);
    }
​
    @Bean
    public Queue queueCourseRemove() {
        return new Queue(QUEUE_COURSE_REMOVE);
    }
​
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange(COURSE_EXCHANGE);
    }
​
    @Bean
    public Binding bindCourseSave() {
        return BindingBuilder.bind(queueCourseSave()).to(topicExchange()).with(KEY_COURSE_SAVE);
    }
​
    @Bean
    public Binding bindCourseRemove() {
        return BindingBuilder.bind(queueCourseRemove()).to(topicExchange()).with(KEY_COURSE_REMOVE);
    }
}

5) 生产者RabbitTemplate发送消息的核心代码

@Autowired
RabbitTemplate rabbitTemplate;
​
//发消息的代码
rabbitTemplate.convertAndSend(交换机的名称,消息的key,消息内容);

6)消费者添加监听器 RabbitListener监听器注解

@Slf4j
@Component
public class CourseMQListener {
​
    public static final String QUEUE_COURSE_SAVE = "queue.course.save";
    public static final String QUEUE_COURSE_REMOVE = "queue.course.remove";
    public static final String KEY_COURSE_SAVE = "key.course.save";
    public static final String KEY_COURSE_REMOVE = "key.course.remove";
    public static final String COURSE_EXCHANGE = "course.exchange";
​
    /**
     * 监听课程添加操作
     */
    @RabbitListener(bindings = {
            @QueueBinding(value = @Queue(value = QUEUE_COURSE_SAVE, durable = "true"),
                    exchange = @Exchange(value = COURSE_EXCHANGE,
                            type = ExchangeTypes.TOPIC,
                            ignoreDeclarationExceptions = "true")
                    , key = KEY_COURSE_SAVE)})
    public void receiveCourseSaveMessage(String message) {
        try {
            log.info("课程添加:{}",message);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
​
    /**
     * 监听课程删除操作
     */
    @RabbitListener(bindings = {
            @QueueBinding(value = @Queue(value = QUEUE_COURSE_REMOVE, durable = "true"),
                    exchange = @Exchange(value = COURSE_EXCHANGE,
                            type = ExchangeTypes.TOPIC,
                            ignoreDeclarationExceptions = "true")
                    , key = KEY_COURSE_REMOVE)})
    public void receiveCourseDeleteMessage(Long id) {
        try {
            log.info("课程删除完成:{}",id);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

6 小结

一、消息队列是分布式系统的重要组件,起到的作用有:

  1. 解耦,生产者和消费者不需要知道对方的具体接口

  2. 异步,生产者发送完消息直接结束,不需要等待消费者执行完,效率高

  3. 削峰,控制高峰期消息的数量,降低服务器压力

二、RabbitMQ的消息模型有:

  1. 一对一,一个生产者一个队列一个消费者,一个发一个收

  2. 一对多,一个生产者一个队列多个消费者,多个消费者共享一个队列中的消息

  3. 发布订阅模式

    由交换机绑定多个队列,消息分发到多个队列,每个消费者消费自己的队列中的消息

  4. 路由模式

    在发布订阅模式的基础上,加入路由键,消息通过键路由到不同的队列

  5. 主题模式

    在路由模式基础上,键中加入通配符,实现更加灵活的匹配文章来源地址https://www.toymoban.com/news/detail-826445.html

到了这里,关于RabbitMQ初级的部分面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(五):分布式搜索 ES-下

    聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 度量(Metric)聚合:用以计算一些值,比如:最大值

    2024年03月26日
    浏览(65)
  • RabbitMQ——解决分布式事务问题,RabbitMQ的重要作用之一!!!通过可靠生产和可靠消费来完美解决!

    分布式事务是指涉及多个独立的计算机系统(也称为节点或参与者)之间的事务处理。在分布式系统中,每个节点可能各自拥有自己的数据存储和事务管理机制。分布式事务的目标是保证在跨多个节点执行的一系列操作可以以一致和可靠的方式执行和提交,即使在面对故障或

    2024年04月23日
    浏览(48)
  • Python爬虫分布式架构 - Redis/RabbitMQ工作流程介绍

    在大规模数据采集和处理任务中,使用分布式架构可以提高效率和可扩展性。本文将介绍Python爬虫分布式架构中常用的消息队列工具Redis和RabbitMQ的工作流程,帮助你理解分布式爬虫的原理和应用。 为什么需要分布式架构? 在数据采集任务中,单机爬虫可能面临性能瓶颈和资

    2024年02月11日
    浏览(45)
  • 分布式消息队列:Kafka vs RabbitMQ vs ActiveMQ

    在现代分布式系统中,消息队列是一种常见的异步通信模式,它可以帮助系统处理高并发、高可用性以及容错等问题。在这篇文章中,我们将深入探讨三种流行的分布式消息队列:Apache Kafka、RabbitMQ和ActiveMQ。我们将讨论它们的核心概念、算法原理、特点以及使用场景。 随着

    2024年02月02日
    浏览(63)
  • 微服务学习:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    目录 一、高级篇 二、面试篇 ==============实用篇============== day05-Elasticsearch01 1.初识elasticsearch 1.4.安装es、kibana 1.4.1.部署单点es 1.4.2.部署kibana 1.4.3.安装IK分词器 1.4.4.总结 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.

    2024年02月02日
    浏览(59)
  • (黑马出品_07)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 聚合 可以让我们极其方便

    2024年03月12日
    浏览(56)
  • 分布式搜索引擎(Elastic Search)+消息队列(RabbitMQ)部署(商城4)

    1、全文搜索 Elastic search可以用于实现全文搜索功能,例如商城中对商品搜索、搜索、分类搜索、订单搜索、客户搜索等。它支持复杂的查询语句、中文分词、近似搜索等功能,可以快速地搜索并返回匹配的结果。 2、日志分析 Elastic search可以用于实现实时日志分析,例

    2024年02月04日
    浏览(51)
  • 分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

    本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 同步调用 方案一:同步调用 基本步骤如下: hotel-demo对外提供接口,用来修改elasticsearch中的数据 酒店管理服务在完成数据库操

    2024年04月11日
    浏览(46)
  • (黑马出品_高级篇_04)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 消息队列在使用过程中,面

    2024年03月19日
    浏览(48)
  • 【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性

    org.springframework.boot spring-boot-starter-amqp mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-jdbc com.alibaba fastjson 1.2.17 3.2.1.2配置文件内容: server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=tru

    2024年04月14日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包