微服务——重试 和 超时

Retry

基本概念

  • RPC Remote Procedure Call

问题场景

解决方案

  • 重试风暴、系统雪崩

  • 重试的最终目的是提高成功率

  • 由于网络抖动,重试要有退让机制

    • 线性、随机、指数
  • 熔断机制

    • 断路器模式
      • 滑动窗口,调用成功率阈值
    • 访问者自带断路器
  • grpc 重试次数链路指数放大问题

    • 重试的最终目的是只在发生问题的地方进行重试,不用全链路重试
    • 下游返回特殊码 1,表示已经重试过,上游不要再重试
    • 上游重试调用时带上特殊码 2,表示上游以重试方式调用,下游不要再重试
    • 即使存在极端情况下丢消息问题,也只是增加重试倍数(1.2),不会指数放大
  • 超时策略导致重试失效

    • 不合理的超时,上游超时时间短、下游超时时间长
    • 利用 DDL 实现超时,总时间超时不再向下调用
  • 为了处理重试、超时问题,对系统业务逻辑有侵入

    • 可以在 gRPC 中间件进行处理,中间件配置直接从 apollo 读取,做到业务无感知
  • 引用文章: RPC 的超时设置,一不小心就是线上事故 字节跳动 | 微服务架构中如何优雅地重试?