【后端开发面试题】每日 3 题(十三)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:https://blog.csdn.net/newin2020/category_12903849.html

📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家,每天的题目都是独立且随机的,之前的面试题不会影响接下来的学习~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

题目 1: 什么是缓存穿透、缓存击穿和缓存雪崩?如何解决这些问题?

答案:

缓存是提高系统性能的重要手段,但在实际使用中可能会遇到以下三种问题:

  1. 缓存穿透

    • 定义:查询一个不存在的数据,缓存和数据库都没有命中,导致请求直接打到数据库。
    • 解决方案
      • 使用布隆过滤器(Bloom Filter)提前过滤掉无效的查询请求。
      • 对于空结果也设置缓存,并设置较短的过期时间。
  2. 缓存击穿

    • 定义:某个热点数据在缓存中失效时,大量请求同时打到数据库,造成数据库压力骤增。
    • 解决方案
      • 设置热点数据永不过期。
      • 使用互斥锁(如 Redis 的分布式锁)确保只有一个请求加载数据到缓存,其他请求等待。
  3. 缓存雪崩

    • 定义:大量缓存在同一时间失效,导致所有请求都打到数据库,引发系统崩溃。
    • 解决方案
      • 给缓存设置随机的过期时间,避免同时失效。
      • 增加多级缓存(如本地缓存 + 分布式缓存)。
      • 在缓存失效时启动降级策略(如返回默认值或静态页面)。

题目 2: 如何设计一个分布式任务调度系统?请描述核心组件和实现思路。

答案:

分布式任务调度系统用于在分布式环境中协调和执行定时任务,以下是其核心组件和实现思路:

核心组件:

  1. 任务管理模块

    负责任务的注册、配置和状态管理,包括任务名称、执行时间、执行频率等信息。

  2. 调度器 (Scheduler)

    根据任务的执行时间和频率,触发任务的执行。可以使用时间轮算法或优先队列实现高效的调度。

  3. 执行器 (Executor)

    实际执行任务逻辑的组件,分布在不同的节点上,支持水平扩展。

  4. 分布式协调模块

    使用分布式协调工具(如 Zookeeper 或 Consul)确保任务在多个节点之间只被一个节点执行。

  5. 监控与报警模块

    记录任务的执行日志、状态和性能指标,并在任务失败时发送报警通知。

实现思路:

  1. 任务分发

    调度器将任务分配给可用的执行器,确保负载均衡。

  2. 任务幂等性

    确保任务即使被多次执行也不会产生副作用。

  3. 容错机制

    如果某个执行器宕机,调度器需重新分配任务到其他节点。

  4. 动态扩展

    支持动态添加或移除执行器节点,无需重启系统。

示例:

使用 Quartz 配合 Redis 实现分布式任务调度:

  • Quartz 负责任务的调度逻辑。
  • Redis 存储任务的状态和锁,确保任务的唯一性和一致性。

题目 3: 什么是消息队列?它的作用是什么?常见的消息队列有哪些?

答案:
消息队列是一种异步通信机制,用于在分布式系统中传递消息,解耦生产者和消费者。

作用:

  1. 解耦

    生产者和消费者之间通过消息队列进行通信,彼此无需直接依赖。

  2. 异步处理

    将耗时操作放入消息队列,消费者异步处理,提升系统的响应速度。

  3. 削峰填谷

    在高并发场景下,消息队列可以缓冲流量,避免下游系统过载。

  4. 可靠性

    消息队列支持持久化存储,确保消息不会因系统故障而丢失。

常见的消息队列:

  1. RabbitMQ

    • 特点:支持多种协议(如 AMQP),功能强大,适合复杂的路由场景。
    • 应用场景:金融系统、订单处理。
  2. Kafka

    • 特点:高吞吐量,适合大规模数据流处理。
    • 应用场景:日志收集、实时数据分析。
  3. RocketMQ

    • 特点:高性能,支持事务消息,适合电商等对可靠性要求高的场景。
    • 应用场景:订单系统、库存管理。
  4. ActiveMQ

    • 特点:成熟稳定,支持 JMS 协议。
    • 应用场景:传统企业级应用。

选择建议:

根据业务需求选择合适的消息队列,例如高吞吐量场景选择 Kafka,复杂路由场景选择 RabbitMQ。

相关推荐
无名之逆1 分钟前
Hyperlane:轻量、高效、安全的 Rust Web 框架新选择
开发语言·前端·后端·安全·rust·github·ssl
Asthenia04124 分钟前
当Spring服务接入ElasticSearch:如何优雅的CRUD呢?
后端
小诸葛的博客16 分钟前
开发一个go模块并在其他项目中引入
开发语言·后端·golang
Emma歌小白16 分钟前
初步使用UML设计代码结构
后端
剽悍一小兔38 分钟前
Java8默认方法の终极奥义
后端
tonngw38 分钟前
大数据 Spark 技术简介
大数据·分布式·spark
Emma歌小白41 分钟前
UML(Unified Modeling Language,统一建模语言)应用方向
后端
雷渊1 小时前
mybatis底层为什么设计二层缓存?
java·后端·面试
祝瑾萱1 小时前
Go语言的负载均衡
开发语言·后端·golang
java技术小馆1 小时前
Kafka的流量控制机制
java·分布式·kafka