使用功能区和Hystrix自定义重试行为

客观

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

  • 网关/ LB应将请求重定向到第三方服务实例(无代码更改=客户端服务发现)
  • 每个服务实例只能同时处理单个响应,即并发请求=立即错误响应。
  • 服务响应延迟为0-5秒。我无法缓存他们的回复,因此据我了解,对于我来说,不能选择使用后备广告。超时也不是一种选择,因为延迟是随机的,并且您不能保证在另一个实例上会得到更好的补偿。

我的解决方案

Spring Boot Cloud Netflix:Zuul-Hystrix-Ribbon。两种方法:

  1. 重试。色带以固定间隔或指数增长重试。我无法使其正常运行,我获得的最佳结果是MaxAutoRetriesnextServer: 1000,其中Ribbon立即启动重试,并向垃圾邮件发送垃圾邮件。
  2. 断路器。无需在功能区中添加指数等待期,我可以在几次失败后断开电路,然后将请求重定向到其他服务。这也不是最好的方法,原因有两个:a)每个实例只有几个实例,延迟为0-5秒,这意味着非常快地断开所有电路,无法满足请求。 b)我的配置由于某种原因无法正常工作

问题

如何让Ribbon在重试之间等待?还是可以用断路器解决我的问题?

我的配置

完整配置可在GitHub上找到。

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

测试

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

qazwsx991688 回答:使用功能区和Hystrix自定义重试行为

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2973945.html

大家都在问