实用指南:【Java八股文】13-中间件面试篇

news/2025/9/25 19:49:55/文章来源:https://www.cnblogs.com/ljbguanli/p/19111879

实用指南:【Java八股文】13-中间件面试篇

【Java八股文】13-中间件面试篇

  • RabbitMQ
    • 什么是消息队列 (MQ)?为什么要使用消息队列?
    • 同步通信和异步通信有什么区别?
    • RabbitMQ 是什么?它有哪些核心组件?
    • 如何保证消息的可靠性?
    • RabbitMQ的事务机制
    • MQ怎么避免重复消费?
    • 什么是死信队列 (DLX)?它有什么作用?
    • 什么是延时队列/延迟队列?如何实现延时队列?
    • 什么是惰性队列?它解决了什么问题?
    • 如何保证Canal+MQ同步消息的顺序性?
  • Kafka
    • 你说说 Kafka 为什么是高性能的?
    • Kafka的使用场景,是否有消息丢失的情况
    • RocketMQ、Kafka 和 RabbitMQ
  • Elasticsearch
    • 什么是 Elasticsearch?它与 MySQL 有什么区别?
    • 什么是倒排索引?在 Elasticsearch 中作用?
    • 倒排索引构建过程
    • Elasticsearch 中什么是索引 (Index)?文档 (Document)?
    • 如何保证 MySQL 和 Elasticsearch 数据同步?
    • Canal+MQ如何同步商品信息到ES中?
  • Docker
    • Docker和传统虚拟机有什么区别?
    • Docker 和 k8s 之间是什么关系?
    • Dockerfile和DockerCompose
  • Git
    • git使用工作流程
    • git merge 、git rebase、 git fetch的区别


RabbitMQ

什么是消息队列 (MQ)?为什么要使用消息队列?

消息队列 (Message Queue - MQ) 是一种异步通信机制,允许不同的应用程序或服务通过消息进行解耦和通信。 使用 MQ 的主要原因包括:

同步通信和异步通信有什么区别?

  • 同步通信 (Synchronous): 请求发出后,发送者必须等待接收者响应才能继续执行。类似于打电话,需要对方接听并回应。 问题: 阻塞等待,效率低,依赖性强。
  • 异步通信 (Asynchronous): 请求发出后,发送者无需等待接收者响应,可以继续执行其他任务。接收者会在稍后处理请求并通知发送者 (通常通过回调或消息)。类似于发短信,发送后无需等待回复。 优点: 高效,解耦,非阻塞。

RabbitMQ 是什么?它有哪些核心组件?

RabbitMQ 是一个开源的消息队列中间件,基于 AMQP (高级消息队列协议) 实现。 核心组件包括:

如何保证消息的可靠性?

消息可靠性通常从生产者、MQ Broker 和消费者三个方面考虑:

  • 生产者消息确认机制 (Producer Confirmation):
    • Publisher Confirm (发布确认): 生产者发送消息后,MQ Broker 返回确认 (ACK) 或拒绝 (NACK),生产者根据结果判断消息是否成功发送到 Broker。
    • Publisher Returns (发布回退): 当消息成功到达 Exchange,但 Exchange 无法路由到任何队列时,Broker 会将消息退回给生产者 (需要设置 mandatory 参数)。
  • 消息持久化 (Message Persistence):
    • 队列持久化: 声明队列时设置为持久化,即使 RabbitMQ 重启,队列元数据也不会丢失。
    • 消息持久化: 发送消息时设置为持久化,消息会被写入磁盘,即使 RabbitMQ 服务崩溃重启,消息也不会丢失 (但会牺牲一些性能)。
  • 消费者确认机制 (Consumer Acknowledgement - ACK):
    • 手动 ACK (Manual Acknowledgement): 消费者在成功处理消息后,手动发送 ACK 给 RabbitMQ Broker。 如果消费者在处理消息过程中崩溃或未发送 ACK,Broker 会将消息重新投递给其他消费者或重回队列。
    • 自动 ACK (Auto Acknowledgement): 消费者接收到消息后,RabbitMQ Broker 立即认为消息已被成功消费 (存在消息丢失风险,不推荐用于高可靠场景)。
  • 失败重试机制 (Retry Mechanism): 消费者消费消息失败时,可以进行重试。

RabbitMQ的事务机制

RabbitMQ 的事务是通过 Channel 的事务性 (Transactional Channel) 来实现的。 我们可以通过以下步骤开启和使用事务:

  • 将 Channel 设置为事务模式: 通过 channel.txSelect() 命令将当前的 Channel 设置为事务模式。
  • 执行消息发布操作: 在事务模式下,我们像正常一样使用 channel.basicPublish() 发布消息。
  • 提交事务或回滚事务:
    • channel.txCommit(): 如果消息发布成功,并且我们希望提交事务,就调用 txCommit()。 这会告知 Broker 提交当前事务内的所有操作 (例如,消息发布)。
    • channel.txRollback(): 如果在消息发布过程中发生任何错误,或者我们想取消本次发布,就调用 txRollback()。 这会告知 Broker 回滚当前事务内的所有操作。

MQ怎么避免重复消费?

  • 需要保证MQ消费消息的幂等性。使用数据库的唯一约束去控制。添加唯一索引保证添加数据的幂等性
  • 使用token机制发送消息时给消息指定一个唯一的ID,发送消息时将消息ID写入Redis消费时根据消息ID查询Redis判断是否已经消费,如果已经消费则不再消费。

什么是死信队列 (DLX)?它有什么作用?

死信队列 (Dead Letter Exchange - DLX) 是一种特殊的 Exchange,用于接收无法被正常消费的消息 (死信消息)。 死信消息通常是因为以下原因产生的:

作用: DLX 可以用来处理消费失败的消息,例如:

什么是延时队列/延迟队列?如何实现延时队列?

延时队列/延迟队列 (Delayed Queue) 是一种消息在发送后不会立即被消费,而是延迟一段时间后才被消费的队列。 常用于实现定时任务、订单超时取消等功能。

实现方式 (根据 outline):

  • TTL + DLX (Time-To-Live + Dead Letter Exchange):
    • 声明一个 延迟队列 (设置消息 TTL)。
    • 声明一个 死信交换机 (DLX) 和 死信队列 (DLQ)。
    • 将 延迟队列 的 死信交换机 设置为 DLX, 死信路由键 设置为 DLQ 的路由键。
    • 生产者发送消息到 延迟队列,并设置消息的 TTL。
    • 当消息 TTL 过期 后,RabbitMQ 会将消息 投递到 DLX,DLX 根据路由键将消息 路由到 DLQ。
    • 消费者 监听 DLQ,接收延迟消息并进行处理。
  • RabbitMQ Delay Exchange Plugin: RabbitMQ 官方提供的 Delay Exchange 插件,提供了更方便的延时队列实现。 可以通过设置消息头来指定消息的延迟时间。

什么是惰性队列?它解决了什么问题?

惰性队列 (Lazy Queue) 是 RabbitMQ 提供的一种 特殊的队列类型,用于解决 消息堆积问题。

问题: 默认的 RabbitMQ 队列 (经典队列) 会将消息尽可能地 保存在内存中,以提高性能。 当队列中消息堆积过多时,会 占用大量内存,可能导致 RabbitMQ 性能下降甚至崩溃。

惰性队列的特点: 惰性队列会将 消息尽可能地写入磁盘,只有在消费者需要消费时才加载到内存中。

  • 优点: 可以 存储大量消息,减少内存占用,避免内存溢出。
  • 缺点: 消息存取性能会下降,吞吐量降低。

如何保证Canal+MQ同步消息的顺序性?

Canal解析binlog日志信息按顺序发到MQ的队列中。现在是要保证消费端如何按顺序消费队列中的消息。

解决方法:

Kafka

你说说 Kafka 为什么是高性能的?

Kafka的使用场景,是否有消息丢失的情况

  • 实时数据流处理:Kafka 常用于处理实时数据流,如日志收集、监控数据传输、点击流分析等。
  • 日志聚合:它可以收集来自不同系统的日志,统一传输到中心化的日志存储或分析系统。
  • 事件源架构:用于在微服务架构中传递事件,确保不同服务之间的通信。
  • 消息队列:作为高吞吐量、高可用性的消息队列,支持异步消息处理。
  • 数据管道:Kafka 作为流数据平台,通常用于将数据从一个系统传输到另一个系统,像数据库同步、ETL等。

RocketMQ、Kafka 和 RabbitMQ

Elasticsearch

什么是 Elasticsearch?它与 MySQL 有什么区别?

Elasticsearch (ES) 是 分布式、RESTful 的搜索和分析引擎,基于 Lucene 构建。 与 MySQL 的区别:

什么是倒排索引?在 Elasticsearch 中作用?

倒排索引是 词 (Term) 到文档的映射。

  • 传统索引: 文档 -> 词列表 (找包含词的文档 - 慢)。
  • 倒排索引: 词 -> 文档列表 (找文档中的词 - 快)。

ES 中的作用:

  • 分析文档: 索引时分析文本字段 (分词等)。
  • 建倒排索引: 词指向包含它的文档 ID 列表。
  • 快速全文搜索: 搜索时查倒排索引快速找文档。

倒排索引(Inverted Index)是搜索引擎中常用的一种数据结构,目的是为了高效地进行文本搜索。具体到 Elasticsearch(ES),倒排索引用于存储文档中各个词项(词语)及其出现位置,以便快速查找包含某个词的文档。

倒排索引的基本原理:

  • 词项(Term):文档中的每个单词或短语。
  • 文档(Document)外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

倒排索引构建过程

Elasticsearch 中什么是索引 (Index)?文档 (Document)?

  • 索引 (Index):
    • 文档的逻辑分组,类似 MySQL 的数据库或表。
    • 定义文档的 Mapping (schema)。
  • 文档 (Document):
    • JSON 对象,存储在索引中,类似 MySQL 的行。
    • 包含字段 (键值对),值可以是不同数据类型。
    • 同索引的文档结构可以略有不同 (灵活 Schema)。

如何保证 MySQL 和 Elasticsearch 数据同步?

常用 消息队列 (MQ) - RabbitMQ 同步数据:

  • MySQL 变更 -> 事件: MySQL 数据变动时生成事件 (触发器、Debezium 或程序逻辑)。
  • 发布事件到 MQ (RabbitMQ): 事件发到 RabbitMQ 队列。
  • ES 消费者服务: 专门服务消费 MQ 消息。
  • 更新 Elasticsearch: 消费者服务处理事件,更新 ES 文档。

MQ 同步优势: 异步、可靠、可扩展。

Canal+MQ如何同步商品信息到ES中?

  1. 首先在Elasticsearch中创建商品的索引结构,包括商品的spu信息、sku信息,这样输入关键字可以根据商品的spu去搜索也可以根据商品的sku去搜索。
  2. 在MySQL中创建一张商品信息同步表,当修改商品信息时同时修改商品信息同步表,商品信息同步表的结构与Elasticsearch中的商品索引是一致的。
  3. Canal会读取商品信息同步表的binlog日志,解析日志的内容写入MQ。
  4. 同步程序监听MQ,收到商品的信息后写入Elasticsearch,这样就完成了同步商品信息到ES中。

Docker

Docker和传统虚拟机有什么区别?

Docker 和 k8s 之间是什么关系?

Docker 和 Kubernetes(K8s)是密切相关的,但它们的功能不同:

  • Docker:是一个容器化平台,用于打包、分发和运行应用。它提供了创建、管理和运行容器的工具。容器可以理解为轻量级的虚拟机,但它们共享宿主操作系统的内核。
  • Kubernetes(K8s):是一个容器编排平台,用于自动化容器的部署、扩展和管理。它可以帮助管理多个 Docker 容器,处理容器的生命周期、调度、负载均衡等任务。

Docker 是 K8s 使用的容器运行时(container runtime)。也就是说,K8s 管理和调度的是 Docker 容器的实例。K8s 可以启动、停止和扩展 Docker 容器,但它不提供容器创建的功能,那个是由 Docker 提供的。

Docker 用于创建和运行容器,K8s 用于管理多个 Docker 容器的集群。

Dockerfile和DockerCompose

# 指定基础镜像
FROM java:8-alpine
# # 配置环境变量,JDK的安装目录
# ENV JAVA_DIR=/usr/local
# # 拷贝jdk和java项目的包
# COPY ./jdk8.tar.gz $JAVA_DIR/
# # 安装JDK
# RUN cd $JAVA_DIR \
#  && tar -xf ./jdk8.tar.gz \
#  && mv ./jdk1.8.0_144 ./java8
# # 配置环境变量
# ENV JAVA_HOME=$JAVA_DIR/java8
# ENV PATH=$PATH:$JAVA_HOME/bin
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
  • Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123sjbsjb
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"

Git

git使用工作流程

工作流程步骤:

  1. master 分支创建一个新的功能分支
git checkout -b feature-branch
  1. 在功能分支上进行开发和提交
git add . # 添加更改
git commit -m "feature: add new feature" # 提交更改
  1. 保持功能分支与 master 分支同步在功能开发过程中,定期将 master分支的最新更改合并到功能分支,以防止冲突。
git checkout master # 切换到主分支
git pull origin master # 拉取最新的 master
git checkout feature-branch
git merge master # 将 master 的更新合并到 feature 分支
  1. 功能完成后将功能分支合并到 master 分支
git checkout master
git merge feature-branch
  1. 推送到远程仓库并删除功能分支
git push origin master # 推送更新到远程仓库
git branch -d feature-branch # 删除本地功能分支
git push origin --delete feature-branch # 删除远程功能分支

优点:每个功能开发都在独立的分支中进行,避免了不同功能的代码干扰。

缺点:需要频繁合并,管理多个分支可能稍显复杂。

git merge 、git rebase、 git fetch的区别

命令作用特点
git merge将两个分支的更改合并保留分支历史,产生合并提交
git rebase将一个分支的提交重放到另一个分支上重写历史,产生线性历史
git fetch从远程仓库拉取最新的提交和元数据不修改本地工作区,只更新远程跟踪分支
  • 使用 git merge 时,你的分支历史会保留原样,适合保留不同开发路径的痕迹。
  • 使用 git rebase 时,历史会变得更整洁,适合在合并前清理历史。
  • 使用 git fetch 时,只有从远程仓库拉取数据,并不会对本地分支产生直接影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AT_agc012_d [AGC012D] Colorful Balls

考虑到可操作的两个球连边,同一个连通块一定能任意交换,方案数是好算的,现在我们需要优化这个建边的过程。 首先,对于同色球,先只考虑最小值和其他球连边,这样一定最优,然后,对于异色球,我们选最小值,非最小…

网站建设套路毕节市交通建设集团网站

可以用,现在很多本地生活商家,都会通过借助批量剪辑工具来提升视频的曝光量,从而带动店铺的客流量。 推荐本地生活商家使用超级编导批量剪辑工具,这是一款0基础小白也可以很快上手的批量剪辑工具,剪辑页面布局以及功能…

销售网站html源码淮南市官网

运用 Transformers 库来完成翻译任务。翻译是典型的序列到序列 (sequence-to-sequence, Seq2Seq) 任务,即对于每一个输入序列都会输出一个对应的序列。翻译在任务形式上与许多其他任务很接近,例如: 文本摘要 (Summarization):将长…

02、Python从入门到癫狂:函数与资料容器

02、Python从入门到癫狂:函数与资料容器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

9/25

今天学了算法数结构,学了许多与线性表相关的知识。

社区服务呼叫系统 网站的建设网站效果图设计

提供帧动画组件来实现逐帧播放图片的能力,可以配置需要播放的图片列表,每张图片可以配置时长。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 ImageAni…

关闭Edge浏览器页面的圆角效果

起因 edge浏览器的这个圆角我看着不太习惯 ,特别是在看一些博客文章的时候 ,总感觉不太舒服 ,所以想给他关闭掉关闭或者开启设置在浏览器搜索框输入edge://flags然后再在页面的搜索框中输入Microsoft Edge rounded …

搜索二维矩阵II-leetcode

题目描述 编写一个高效的算法来搜索 *m* x *n* 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。 每列的元素从上到下升序排列。示例 1:输入:matrix = [[1,4,7,11,15],[2,5,8…

Rust/C/C++ 混合构建 - Cmake集成Cargo编译动态库

Cmake是一个强大的多语言编译工具,其内置模块提供了强大的扩展能力。 Rust官方的构建工具是Cargo,其提供了依赖下载,上传和编译等多项功能,极大的便利了Rust项目的开发。 目前C++多数用Cmake构建,如果是Rust集成c…

小型公司网站建设知乎济南网站建设网站建设

文章目录 1. Kubernetes的网络类别2. Kubernetes的接口类型3. CNI网络插件 ---- Flannel的介绍及部署3.1 简介3.2 flannel的三种模式3.3 flannel的UDP模式工作原理3.4 flannel的VXLAN模式工作原理3.5 Flannel CNI 网络插件部署3.5.1 上传flannel镜像文件和插件包到node节点3.5.…

织梦网站图片一直转圈品质好物推荐

AOP(Aspect Oriented Programming),面向切面编程,他是一种编程范式。 作用: 在不改变原始设计的的基础上对其进行功能增强。 几个基本概念: 连接点:所有的方法 切入点:追加功能的方法 通知:追加…

LangChain:LLMs和ChatModels介绍、LangChain 集成大模型的本地部署与 API 调用实践、提示词prompt、输出解析器、链 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

卓伊凡的第一款独立游戏-unity安装运行设置以及熟悉整体unity游戏开发和unity editor【02】-优雅草卓伊凡

卓伊凡的第一款独立游戏-unity安装运行设置以及熟悉整体unity游戏开发和unity editor【02】-优雅草卓伊凡2025-09-25 19:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: no…

学习敏捷课程PSM,自考证书分享

PSM课程自考体会心得​ 一直以来,我都对Scrum比较感兴趣,但真正检验自己对Scrum框架的掌握程度,是从准备 PSM(Professional Scrum Master)认证考试 开始的。相比参加培训班,我选择了自考的方式,这段学习过程对我…

详细介绍:基于卷积神经网络的人车识别技术:从原理突破到场景重构的深度探索

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

长春 万网 网站建设中国咨询公司排名50强

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、Wlan应用实战1.1、拓扑图详解1.2、LSW11.3、AC11.4、抓包1.5、Tunnel隧道模式解析1.6、AP、…

专题定制网站建设工信部网站原来是

创建测试用例和测试结果集文件夹: excel编写的接口测试用例如下: 1 encoding 响应的编码格式。所测项目大部分是utf-8,有一个特殊项目是utf-8-sig 2 params 对应requests的params 3 data,对应requests的data 有些参数是动态的&a…

Rust/C/C++ 混合构建 - 用Bazel构建Rust与C

Bazel是什么 Bazel 是一个类似于 Make、Maven 和 Gradle 的开源构建和测试工具。 它使用人类可读的高级 build 语言。Bazel 支持 并针对多个平台构建输出。Bazel 支持 多个代码库和大量用户的大型代码库。 优势 Bazel …

9.24(补)

上午离散数学学的有点意思,下课后看了一眼,马哲的老师讲的也挺有意思的,重点讲了会生产力和生产资料,下午到没干什么,躺了。

9月25号

上午进行了程序语言和数据结构。 然后进行了篮球课。 下午进行了乒乓课。