天天看点

阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析

作者:Java技术栈论坛

前言

消息队列:

消息队列,简称为MQ(Message Queue),是一个保存消息的容器,本质上是一个队列。队列是一种先进先出的数据结构,我们可以简单理解为:把要传输的数据放在队列中。

我们一般把消息队列作为应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只负责把消息发布到 MQ 中,消息使用者只管从 MQ 中取消息,双方都不知道对方的存在,也不用管对方是如何处理。

为什么要用消息队列?

解耦,将各个应用解耦,只需从消息中订阅,防止一处变动多处跟随修改

异步,发送接收双方不必同时在线,加快响应速度

削峰,并发量高峰期的时候,可以从消息队列中稍后读取消息,不会造成系统崩溃

消息队列缺点:

可用性降低:系统外部依赖变多,容易崩溃

复杂性提高:需要考虑消息的一致性问题、可靠传输问题、不被重复消费等问题

二、RabbitMQ 简介

RabbitMQ是一套开源的消息队列服务,基于 AMQP 的开源实现,由 Erlang 写成。

AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

通常消息队列服务有三个概念: 发消息者、消息队列、收消息者。

RabbitMQ 在这个基本概念之上, 多做了一层, 在发消息者和队列之间, 加入了交换器 (Exchange)。这样发消息者和消息队列就没有直接联系,转而变成发消息者把消息发给交换器,交换器根据调度策略再把消息转发给消息队列。

RabbitMQ 核心概念

RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ就好比由邮局、邮箱和邮递员组成的一个系统。从计算机术语层面来说,RabbitMQ 模型更像是一种交换机模型。

今天咱们就来一起学习一下连阿里架构师都在推荐的《RabbitMQ实战指南》以及关于RabbitMQ面试官们最喜欢问的面试题和解答。

另外,前两天用XMind画了一张导图记录RabbitMQ的学习大纲,这里只能用图片的形式,不过源文件对个节点都有详细的解释,若是需要前面说的《RabbitMQ实战指南》和面试解析笔记,可以找小编呀

阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
每个章节都有小目录,因为篇幅原因不能全部展开来看,有需要此份文档进行学习的朋友,麻烦三连支持一下,私信小编【学习】即可~~~

正式步入今天的主题《RabbitMQ实战指南》

共 有11 个章节,前后章节都有相关的联系,基本上按照由浅入深、由表及里的层次逐层进行讲解。如果读者对其中的某些内容已经掌握,可以选择跳过而翻阅后面的内容,不过还是建议读者按照先后顺序进行阅读。

阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
  • 第 1 章 RabbitMQ 简介 :针对消息中间件做一个摘要性介绍,包括什么是消息中间件、消息中间件的作用及特点等。之后引入 RabbitMQ ,对其历史和相关特点做一个简要概述。本章最后介绍RabbitMQ 的安装及生产、消费的使用示例。
  • 第 2 章 RabbitMQ 入门 :讲述RabbitMQ的入门知识,包括生产者、消费者、队列、交换器、路由键、绑定、连接及信道等基本术语。本章还阐述了RabbitMQ与 AMQP 协议的对应关系。
  • **第 3 章 客户端开发向导 :**介绍 RabbitMQ 客户端开发的简单使用,按照个生命周期对连接、创建、生产、消费及关闭等几个方面进行宏观的介绍。
  • **第 4 章 RabbitMQ 进阶 :**介绍数据可靠性的 些细节,井展示 RabbitMQ 的几种己具备或衍生的高级特性,包括TTL、死信队列、延迟队列、优先级队列、 RPC 等,这些功能在实际使用中可以让某些应用的实现变得事半功倍。
  • **第 5 章 RabbitMQ 管理 :**围绕 RabbitMQ 管理这个主题展开,包括多租户、权限、用户、应用和集群管理、服务端状态等方面,井且从侧面讲述 rabbitmqctl 工具和 rabbitmq_management 插件的使用。
  • **第 6 章 RabbitMQ 配置 :**讲述 RabbitMQ 的配置,以此可以通过环境变量、配置文件、运行时参数(和策略)等三种方式来定制化相应的服务。
  • **第 7 章 RabbitMQ 运维 :**围绕运维层面展开论述,主要包括集群搭建、日志查看、故障恢复、集群迁移、集群监控这几个方面。
  • 第 8 章 跨越集群的界限 :讲述 Federation Shovel 这两个插件的使用、细节及相关原理 区别于第7章中集群的部署方式, Federation Shovel 可以部署在广域网中,为RabbitMQ 提供更广泛的应用空间。
  • **第 9 章 RabbitMQ 高阶 :**介绍 RabbitM 相关的一些原理,主要内容包括RabbitM 存储机制、磁盘和内存告警、流控机制、镜像队列。了解这些实现的细节及原理十分必要,它们可以让读者在遇到问题时能够透过现象看本质
  • **第 10 章 网络分区 :**围绕网络分区进行展开,具体阐述网络分区的意义,如何查看和处理网络分区,以及网络分区所带来的影响。
  • **第 11 章 RabbitMQ 扩展 :**探讨RabbitM 的两个扩展内容:消息追踪及负载均衡。消息追踪可以有效地定位消息丢失的问题。负载均衡本身属于运维层面,但是负载均衡一般需要借助第三方的工具-HAProxyLVS 等实现,故本书将其视为扩展内容。
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析

RabbitMQ面试二十三连问

  • 问题一:RabbitMQ 中的 broker 是指什么?cluster 又是指什么?
  • 问题二:什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布的?
  • 问题三:RAM node 和 disk node 的区别?
  • 问题四:RabbitMQ 上的一个 queue 中存放的 message 是否有数量限制?
  • 问题五:RabbitMQ 概念里的 channel、exchange 和 queue 这些东东是逻辑概念,还是对应着进程实体?这些东东分别起什么作用?
  • 问题六:vhost 是什么?起什么作用?
  • 问题七:在单 node 系统和多 node 构成的 cluster 系统中声明 queue、exchange ,以及进行 binding 会有什么不同?
  • 问题八:客户端连接到 cluster 中的任意 node 上是否都能正常工作?
  • 问题九:cluster 中 node 的失效会对 consumer 产生什么影响?若是在 cluster 中创建了mirrored queue ,这时 node 失效会对 consumer 产生什么影响?
  • 问题十:能够在地理上分开的不同数据中心使用 RabbitMQ cluster 么?
  • 问题十一:为什么 heavy RPC 的使用场景下不建议采用 disk node ?
  • 问题十二:向不存在的 exchange 发 publish 消息会发生什么?向不存在的 queue 执行consume 动作会发生什么?
  • 问题十三:routing_key 和 binding_key 的最大长度是多少?
  • 问题十四:RabbitMQ 允许发送的 message 最大可达多大?
  • 问题十五:什么情况下 producer 不主动创建 queue 是安全的?
  • 问题十六:“dead letter”queue 的用途?
  • 问题十七:为什么说保证 message 被可靠持久化的条件是 queue 和 exchange 具有durable 属性,同时 message 具有 persistent 属性才行?
  • 问题十八:什么情况下会出现 blackholed 问题?
  • 问题十九:如何防止出现 blackholed 问题?
  • 问题二十:Consumer Cancellation Notification 机制用于什么场景?
  • 问题二十一:Basic.Reject 的用法是什么?
  • 问题二十二:为什么不应该对所有的 message 都使用持久化机制?
  • 问题二十三:RabbitMQ 中的 cluster、mirrored queue,以及 warrens 机制分别用于解决什么问题?存在哪些问题?
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析

篇幅有限,无论是上面的RabbitMQ二十三连问还是下面的Java高级面试解析之消息队列(面试官心里分析+面试题剖析)都没有把具体的解析答案附上,但是这些面试题及详细的解答小编都有整理成册!

Java高级面试解析之消息队列(面试官心里分析+面试题剖析)

  • 1.为什么使用消息队列 ?消息队列有什么优点和缺点?Kafka 、ActiveMQ 、RabbitMQ 、RocketMQ 都有什么优点和缺点?
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
  • 2. 如何保证消息队列的高可用?(RabbitMQ 的高可用性+Kafka 的高可用性)
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
  • 3. 如何保证消息不被重复消费 ?或者说 ,如何保证消息消费的幂等性 ?
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
  • 4. 如何保证消息的可靠性传输 ? 或者说 ,如何处理消息丢失的问题 ?
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
  • 5. 如何保证消息的顺序性 ?
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
  • 6. 如何解决消息队列的延时以及过期失效问题 ? 消息队列满了以后该怎么处理 ?有几百万消息 持续积压几小时 ,说说怎么解决 ?
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析
  • 7. 如果让你写一个消息队列 ,该如何进行架构设计 ?说一下你的思路 ?
阿里架构师带你RabbitMQ从0到1,含学习大纲,面试解析

撒花环节

RabbitMQ用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗,所以发展到今天,被越来越多的人认可。因此RabbitMQ对于每一个想提升自己的Java程序员来说,都是一个必备的硬性条件,没有理由不学,也没有理由不把它学好。

今天咱们说的这个**《RabbitMQ实战指南》、自己手绘的学习大纲(xmind文件)、RabbitMQ面试二十三连问以及整理的Java高级面试必备的七大消息队列题(面试官心里分析+面试题剖析**),其实都是我们平时学习、面试必备的东西。

每个章节都有小目录,因为篇幅原因不能全部展开来看,有需要此份文档进行学习的朋友,麻烦三连支持一下,私信小编【学习】即可~~~