Microservices 使用Ribbon和Hystrix自定义重试行为 客观的

Microservices 使用Ribbon和Hystrix自定义重试行为 客观的,microservices,netflix-zuul,spring-cloud-netflix,hystrix,netflix-ribbon,Microservices,Netflix Zuul,Spring Cloud Netflix,Hystrix,Netflix Ribbon,我的任务是编写API网关和负载平衡器,目标如下: 网关/LB应将请求重定向到第三方服务实例(无代码更改=客户端服务发现) 每个服务实例只能同时处理单个响应,并发请求=即时错误响应 服务响应延迟为0-5秒。我无法缓存他们的响应,因此据我所知,回退不是我的选择。此外,超时也不是一个选项,因为延迟是随机的,并且您不能保证在另一个实例上会得到更好的延迟 我的解决方案 Spring Boot Cloud Netflix:Zuul Hystrix Ribbon。两种方法: 重试。功能区以固定间隔或指数增

我的任务是编写API网关和负载平衡器,目标如下:

  • 网关/LB应将请求重定向到第三方服务实例(无代码更改=客户端服务发现)
  • 每个服务实例只能同时处理单个响应,并发请求=即时错误响应
  • 服务响应延迟为0-5秒。我无法缓存他们的响应,因此据我所知,回退不是我的选择。此外,超时也不是一个选项,因为延迟是随机的,并且您不能保证在另一个实例上会得到更好的延迟
我的解决方案 Spring Boot Cloud Netflix:Zuul Hystrix Ribbon。两种方法:

  • 重试。功能区以固定间隔或指数增长重试。我没能让它正常工作,我取得的最好结果是
    MaxAutometriesNextServer:1000
    ,Ribbon立即触发重试并向流服务发送垃圾邮件
  • 断路器。我可以在几次失败后打开电路,将请求重定向到另一个服务,而不是在Ribbon中添加指数等待期。这也不是最好的方法,原因有两个:a)只有几个实例,每个实例都有0-5秒的延迟,这意味着所有电路都很快断开,无法满足请求。b) 由于某种原因,我的配置无法工作
  • 问题: 如何使Ribbon在重试之间等待?或者我可以解决断路器的问题吗

    我的配置 可以在上找到完整配置

    测验 为了检查您的假设,您可以使用模拟具有不同延迟的单线程服务实例的

    ribbon:
      eureka:
        enabled: false
      # Obsolete option (Apache HttpClient by default), but without this Ribbon doesn't retry against another instances
      restclient:
        enabled: true
    
    hystrix:
      command:
        my-service:
          circuitBreaker:
            sleepWindowInMilliseconds: 3000
            errorThresholdPercentage: 50
            requestVolumeThreshold: 5
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 5500
    
    my-service:
      ribbon:
        OkToRetryOnAllOperations: false
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
        listOfServers: ${LIST_OF_SERVERS}
        ConnectTimeout: 500
        ReadTimeout: 4500
        MaxAutoRetries: 0
        MaxAutoRetriesNextServer: 1000
        retryableStatusCodes: 404,502,503,504