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

✍个人博客:Pandaconda-优快云博客
📣专栏地址:https://blog.youkuaiyun.com/newin2020/category_12903849.html
📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家,每天的题目都是独立且随机的,之前的面试题不会影响接下来的学习~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

题目 1: 什么是服务熔断与降级?它们的区别是什么?如何实现服务熔断与降级?

答案:
服务熔断降级是微服务架构中常用的容错机制,用于提高系统的稳定性和可用性。

服务熔断:

  • 定义:当某个服务出现故障或响应时间过长时,熔断器会快速失败,避免请求堆积导致系统崩溃。
  • 作用:防止雪崩效应,保护下游服务。
  • 实现方式:
    • 使用熔断器模式(如 Hystrix、Resilience4j)。
    • 定义熔断阈值(如连续失败次数)和恢复时间窗口。

服务降级:

  • 定义:在系统压力过大或某些非核心服务不可用时,暂时关闭这些服务,返回默认值或简化功能。
  • 作用:保证核心功能的可用性,提升用户体验。
  • 实现方式:
    • 在代码中实现降级逻辑(如返回缓存数据或静态页面)。
    • 使用配置中心动态调整降级策略。

区别:

特性服务熔断服务降级
触发条件服务不可用或响应超时系统压力过大或资源不足
目标防止级联故障,保护下游服务保证核心功能的可用性
实现方式快速失败,拦截请求返回默认值或简化功能

示例:

  • 熔断:支付服务不可用时,直接返回错误信息,避免用户等待。
  • 降级:商品推荐服务不可用时,返回固定推荐列表。

题目 2: 如何优化 API 的响应时间?请列举至少五种方法并简要说明。

答案:
优化 API 响应时间是提升用户体验的重要手段。以下是五种常见的优化方法:

  1. 缓存数据

    • 使用缓存(如 Redis、Memcached)存储频繁访问的数据,减少数据库查询次数。
    • 示例:缓存热门商品信息,避免每次请求都查询数据库。
  2. 压缩传输内容

    • 使用 Gzip 或 Brotli 压缩 API 的响应数据,减少网络传输时间。
    • 示例:对 JSON 数据进行压缩后再返回给客户端。
  3. 异步处理

    • 将耗时操作(如文件上传、邮件发送)放入消息队列异步处理,提升 API 的响应速度。
    • 示例:用户下单后,订单处理逻辑通过消息队列异步完成。
  4. 优化数据库查询

    • 添加索引、优化 SQL 语句、分库分表,减少查询时间。
    • 示例:为订单表的用户 ID 字段添加索引,加快查询速度。
  5. 使用 CDN

    • 对静态资源(如图片、CSS 文件)使用 CDN 加速,减少服务器负载。
    • 示例:将图片存储在 CDN 上,用户直接从最近的节点获取资源。
  6. 减少不必要的依赖

    • 移除或延迟加载非关键的第三方服务调用,降低整体响应时间。
    • 示例:延迟加载广告或推荐模块的内容。

题目 3: 什么是限流?它的作用是什么?如何实现限流?

答案:
限流是一种用于控制系统的请求速率的技术,防止因流量过大导致系统崩溃。

作用:

  1. 保护系统稳定性
    限制请求速率,避免系统过载。
  2. 提高服务质量
    优先处理重要请求,保障核心功能的可用性。
  3. 防止恶意攻击
    防止 DDoS 攻击或爬虫行为消耗系统资源。

实现限流的方法:

  1. 计数器算法

    • 在固定时间窗口内统计请求次数,超过阈值则拒绝请求。
    • 示例:每秒最多允许 100 次请求。
  2. 滑动窗口算法

    • 将时间窗口划分为多个小窗口,动态计算请求速率。
    • 示例:每秒 100 次请求,但不会集中在某一瞬间。
  3. 令牌桶算法

    • 系统以固定速率生成令牌,每个请求需要消耗一个令牌。如果令牌不足,则拒绝请求。
    • 示例:每秒生成 50 个令牌,超出部分等待或拒绝。
  4. 漏桶算法

    • 请求以恒定速率从“桶”中流出,超出桶容量的请求被丢弃或排队。
    • 示例:每秒处理 100 个请求,多余请求进入队列等待。

实现工具:

  • 使用 Nginx 的限流模块(如 limit_req)。
  • 使用 Redis 实现分布式限流。
  • 使用开源框架(如 Sentinel、Resilience4j)。

示例:
以下是一个基于 Redis 的简单限流实现:

import redis
import time

def is_allowed(user_id, limit, window):
    r = redis.Redis()
    key = f"rate_limit:{user_id}"
    current_time = time.time()
    # 清理过期请求
    r.zremrangebyscore(key, 0, current_time - window)
    # 统计当前窗口内的请求数
    request_count = r.zcard(key)
    if request_count < limit:
        r.zadd(key, {current_time: current_time})
        return True
    return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值