后端工程师的高阶面经


服务注册与发现

基础准备

  • 使用了什么中间件作为注册中心及其该中间件的优缺点.确保回答“你为什么用某个中间件作为注册中心”的时候,能综合这些优缺点回答
  • 注册中心的集群规模(disf?)
  • 读写QPS(每秒查询率?是存在本地agent?)
  • 机器性能,如CPU和内存
  • 最好准备一个注册中心出故障之后你排查和后续优化的案例.
  • zookeeper或者etcd了解下?

知道注册中心?

-> 回答服务注册与发现基本模型,结合上线,下线解释.+disf支持分组?结合集群或者路由组.

高可用

  • 服务端崩溃检测
    • 注册中心与服务端心跳失败,立即通知客户端服务端不可用
    • 注册中心继续心跳避免偶发问题
    • 注册中心在心跳失败后,立即重试几次,如果都失败则间隔时间后重试.中间的时间间隔差需要客户端容错
  • 客户端容错
    • 延迟=注册中心发现服务端崩溃(服务端与注册中心的心跳间隔)+注册中心通知客户端(毫秒级)
    • 客户端的组件将节点移除可用列表.等待服务端恢复.如果是与注册中心断开,则客户端考虑整体退出
  • 注册中心选型
    • 选型考虑AP(服务可用性、分区容错性).

负载均衡

  • 静态负载均衡算法
    • 轮询和加权轮询->平滑加权轮询算法(每次选中后,当前权重下降避免加权导致的部分节点负载问题)
    • 随机和加权随机(没有轮询算法可控性强)
    • 哈希与一致性哈希:哈希的算法选取会严重影响负载均衡效果
  • 动态负载均衡算法
  • 节点负载评估指标
    • 最小连接数
    • 最小活跃数
    • 最快响应时间
  • 大请求带来的服务端节点处理问题
    • 解法:业务拆分(做请求限制)和隔离(不同请求不同机房)
  • 加权算法都需要成加败减,需要设计好上下限.避免溢出或者永远不可选中.
  • 哈希一致性结合本地缓存能提高缓存的命中率,但是服务上线会因为节点变动无法命中.

熔断

  • 什么是熔断
    • 在微服务架构中服务本身出现问题的时候,拒绝新的请求,直到服务恢复
  • 为什么需要熔断
    • 在服务高负载或者服务不可用/缓存崩溃的时候,给系统恢复的时间
      • 服务不再接受新请求,负载降低,线程池减少,防止服务雪崩
      • 服务崩溃时情况下恢复服务
      • 上游收到下游熔断信息,进行兜底方案处理(业务补偿/请求转发…)
  • 熔断开启
    • 判断健康状态
      • 选择业务指标
        • 微服务的划分依据业务职责和边界来划分,如响应时间的99线,错误率
      • 设置合理阈值
        • 业务要求指标阈值设置
        • 服务整体指标设置
      • 多久触发熔断
        • 一般不是立即熔断,而是一段时间后熔断
          • 防止指标偶发性增长
          • 防止服务抖动
        • 持续时间的设置依赖经验,比如30s
    • 判断恢复
      • 现状: 大多数是触发熔断后一段时间就认为服务已恢复
      • 问题: 服务抖动
      • 解法:
        • 服务端控制流量:恢复服务后,试探性逐级恢复流量,不要直接100%流量
        • 客户端控制流量(相对更优):熔断后节点摘流.,一段时间后尝试请求,如正常处理可恢复流量占比.所有节点熔断,告警.

降级

  • 降级与熔断的区别
    • 熔断: 不提供服务,服务负载立即下降
    • 降级: 提供有损服务,服务负载缓慢下降
  • 跨服务降级
    • 整个服务down
    • 停掉服务部分节点
    • 停止访问部门资源
  • 服务本身降级
    • 返回默认值,例如nx中默认返回责任命中911直接返回兜底
    • 禁用mertric或者可观察性组件
    • 同步转异步,后续通过开启额外线程或者定时任务来处理
    • 简化流程
  • 在任何故障处理面前都要考虑恢复策略会不会导致抖动
  • 读写服务降级写服务,保障读服务更重要的场景.虽然写服务的qps低,但是对性能的压力要远大于读请求

文章作者: 不二
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 不二 !
  目录